diff --git a/ChangeLog b/ChangeLog index 3180554e..e864f9c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,7 +26,8 @@ Torben Hohn 2009-03-24 Stephane Letz - * New JackBoomerDriver class for Boomer driver on Solaris. + * New JackBoomerDriver class for Boomer driver on Solaris. + * Add mixed 32/64 mode (off by default). 2009-03-23 Stephane Letz diff --git a/common/JackClientControl.h b/common/JackClientControl.h index 4aa31b0c..a82313c7 100644 --- a/common/JackClientControl.h +++ b/common/JackClientControl.h @@ -79,7 +79,7 @@ struct JackClientControl : public JackShmMemAble fActive = false; } -}; +} POST_PACKED_STRUCTURE; } // end of namespace diff --git a/common/JackConnectionManager.h b/common/JackConnectionManager.h index b95261d6..bb972e31 100644 --- a/common/JackConnectionManager.h +++ b/common/JackConnectionManager.h @@ -356,7 +356,7 @@ struct JackClientTiming {} ~JackClientTiming() {} -}; +} POST_PACKED_STRUCTURE; /*! \brief Connection manager. @@ -445,12 +445,11 @@ class SERVER_EXPORT JackConnectionManager return fInputCounter[refnum].GetValue(); } - - // Graph void ResetGraph(JackClientTiming* timing); int ResumeRefNum(JackClientControl* control, JackSynchro* table, JackClientTiming* timing); int SuspendRefNum(JackClientControl* control, JackSynchro* table, JackClientTiming* timing, long time_out_usec); + }; } // end of namespace diff --git a/common/JackConstants.h b/common/JackConstants.h index 71288d11..5d4a136e 100644 --- a/common/JackConstants.h +++ b/common/JackConstants.h @@ -83,11 +83,7 @@ #define ALL_CLIENTS -1 // for notification -#if defined(__ppc64__) || defined(__x86_64__) -#define JACK_PROTOCOL_VERSION 6 -#else -#define JACK_PROTOCOL_VERSION 5 -#endif +#define JACK_PROTOCOL_VERSION 7 #define SOCKET_TIME_OUT 5 // in sec #define DRIVER_OPEN_TIMEOUT 5 // in sec diff --git a/common/JackEngineControl.h b/common/JackEngineControl.h index a4e2adcd..5f8b604b 100644 --- a/common/JackEngineControl.h +++ b/common/JackEngineControl.h @@ -166,7 +166,7 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end); void ResetRollingUsecs(); -}; +} POST_PACKED_STRUCTURE; } // end of namespace diff --git a/common/JackEngineProfiling.h b/common/JackEngineProfiling.h index 62c4b86e..c06487a0 100644 --- a/common/JackEngineProfiling.h +++ b/common/JackEngineProfiling.h @@ -52,7 +52,8 @@ struct JackTimingMeasureClient fFinishedAt(0), fStatus((jack_client_state_t)0) {} -}; + +} POST_PACKED_STRUCTURE; /*! \brief Timing interval in the global table for a given client @@ -70,7 +71,8 @@ struct JackTimingClientInterval fBeginInterval(-1), fEndInterval(-1) {} -}; + +} POST_PACKED_STRUCTURE; /*! \brief Timing stucture for a table of clients. @@ -90,7 +92,8 @@ struct JackTimingMeasure fCurCycleBegin(0), fPrevCycleEnd(0) {} -}; + +} POST_PACKED_STRUCTURE; /*! \brief Client timing monitoring. @@ -125,7 +128,7 @@ class SERVER_EXPORT JackEngineProfiling JackTimingMeasure* GetCurMeasure(); -}; +} POST_PACKED_STRUCTURE; } // end of namespace diff --git a/common/JackFrameTimer.h b/common/JackFrameTimer.h index 703a90be..1468f1b5 100644 --- a/common/JackFrameTimer.h +++ b/common/JackFrameTimer.h @@ -93,7 +93,8 @@ class SERVER_EXPORT JackFrameTimer : public JackAtomicState void ResetFrameTime(jack_nframes_t frames_rate, jack_time_t callback_usecs, jack_time_t period_usecs); void IncFrameTime(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs); void ReadFrameTime(JackTimer* timer); -}; + +} POST_PACKED_STRUCTURE; } // end of namespace diff --git a/common/JackGraphManager.h b/common/JackGraphManager.h index 67d482e7..5f38dfd9 100644 --- a/common/JackGraphManager.h +++ b/common/JackGraphManager.h @@ -129,7 +129,7 @@ class SERVER_EXPORT JackGraphManager : public JackShmMem, public JackAtomicState void Save(JackConnectionManager* dst); void Restore(JackConnectionManager* src); -}; +} POST_PACKED_STRUCTURE; } // end of namespace diff --git a/common/JackLibClient.cpp b/common/JackLibClient.cpp index ed6a0ba1..f65148e9 100644 --- a/common/JackLibClient.cpp +++ b/common/JackLibClient.cpp @@ -106,7 +106,7 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_options_ } SetupDriverSync(false); - + // Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process if (!fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName)) { jack_error("Cannot ConnectSemaphore %s client", name_res); diff --git a/common/JackPort.cpp b/common/JackPort.cpp index 2afec24b..9eef2aa4 100644 --- a/common/JackPort.cpp +++ b/common/JackPort.cpp @@ -247,13 +247,13 @@ int JackPort::UnsetAlias(const char* alias) void JackPort::ClearBuffer(jack_nframes_t frames) { const JackPortType* type = GetPortType(fTypeId); - (type->init)(fBuffer, frames * sizeof(float), frames); + (type->init)(GetBuffer(), frames * sizeof(float), frames); } void JackPort::MixBuffers(void** src_buffers, int src_count, jack_nframes_t buffer_size) { const JackPortType* type = GetPortType(fTypeId); - (type->mixdown)(fBuffer, src_buffers, src_count, buffer_size); + (type->mixdown)(GetBuffer(), src_buffers, src_count, buffer_size); } } // end of namespace diff --git a/common/JackPort.h b/common/JackPort.h index 4951ffa9..45f90733 100644 --- a/common/JackPort.h +++ b/common/JackPort.h @@ -55,9 +55,8 @@ class SERVER_EXPORT JackPort bool fInUse; jack_port_id_t fTied; // Locally tied source port - - MEM_ALIGN(float fBuffer[BUFFER_SIZE_MAX], 64); // 16 bytes alignment for vector code, 64 bytes better for cache loads/stores - + float fBuffer[BUFFER_SIZE_MAX + 4]; + bool IsUsed() const { return fInUse; @@ -99,14 +98,15 @@ class SERVER_EXPORT JackPort return (fMonitorRequests > 0); } + // Since we are in shared memory, the resulting pointer cannot be cached, so align it here... float* GetBuffer() { - return fBuffer; + return (float*)((long)fBuffer & ~15L) + 4; } int GetRefNum() const; -}; - + +} POST_PACKED_STRUCTURE; } // end of namespace diff --git a/common/JackRequest.h b/common/JackRequest.h index 03cfea4f..e6243b7b 100644 --- a/common/JackRequest.h +++ b/common/JackRequest.h @@ -116,6 +116,7 @@ struct JackResult { return trans->Write(&fResult, sizeof(int)); } + }; /*! @@ -151,7 +152,8 @@ struct JackClientCheckRequest : public JackRequest CheckRes(trans->Write(&fProtocol, sizeof(int))); return trans->Write(&fOptions, sizeof(int)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief CheckClient result. @@ -186,7 +188,8 @@ struct JackClientCheckResult : public JackResult CheckRes(trans->Write(&fStatus, sizeof(int))); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief NewClient request. @@ -218,7 +221,8 @@ struct JackClientOpenRequest : public JackRequest CheckRes(trans->Write(&fPID, sizeof(int))); return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief NewClient result. @@ -255,7 +259,8 @@ struct JackClientOpenResult : public JackResult CheckRes(trans->Write(&fSharedGraph, sizeof(int))); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief CloseClient request. @@ -281,7 +286,8 @@ struct JackClientCloseRequest : public JackRequest CheckRes(JackRequest::Write(trans)); return trans->Write(&fRefNum, sizeof(int)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief Activate request. @@ -312,7 +318,7 @@ struct JackActivateRequest : public JackRequest return trans->Write(&fState, sizeof(int)); } -}; +} POST_PACKED_STRUCTURE; /*! \brief Deactivate request. @@ -339,7 +345,7 @@ struct JackDeactivateRequest : public JackRequest return trans->Write(&fRefNum, sizeof(int)); } -}; +} POST_PACKED_STRUCTURE; /*! \brief PortRegister request. @@ -383,7 +389,8 @@ struct JackPortRegisterRequest : public JackRequest CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int))); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief PortRegister result. @@ -408,7 +415,8 @@ struct JackPortRegisterResult : public JackResult CheckRes(JackResult::Write(trans)); return trans->Write(&fPortIndex, sizeof(jack_port_id_t)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief PortUnregister request. @@ -440,7 +448,8 @@ struct JackPortUnRegisterRequest : public JackRequest CheckRes(trans->Write(&fPortIndex, sizeof(jack_port_id_t))); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief PortConnectName request. @@ -479,7 +488,8 @@ struct JackPortConnectNameRequest : public JackRequest CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1)); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief PortDisconnectName request. @@ -517,7 +527,8 @@ struct JackPortDisconnectNameRequest : public JackRequest CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1)); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief PortConnect request. @@ -552,8 +563,8 @@ struct JackPortConnectRequest : public JackRequest CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); return 0; } -}; - + +} POST_PACKED_STRUCTURE; /*! \brief PortDisconnect request. @@ -589,7 +600,8 @@ struct JackPortDisconnectRequest : public JackRequest return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief PortRename request. @@ -627,7 +639,8 @@ struct JackPortRenameRequest : public JackRequest return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief SetBufferSize request. @@ -654,7 +667,8 @@ struct JackSetBufferSizeRequest : public JackRequest CheckRes(JackRequest::Write(trans)); return trans->Write(&fBufferSize, sizeof(jack_nframes_t)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief SetFreeWheel request. @@ -681,7 +695,8 @@ struct JackSetFreeWheelRequest : public JackRequest CheckRes(JackRequest::Write(trans)); return trans->Write(&fOnOff, sizeof(int)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief ReleaseTimebase request. @@ -708,7 +723,8 @@ struct JackReleaseTimebaseRequest : public JackRequest CheckRes(JackRequest::Write(trans)); return trans->Write(&fRefNum, sizeof(int)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief SetTimebaseCallback request. @@ -738,7 +754,8 @@ struct JackSetTimebaseCallbackRequest : public JackRequest CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fConditionnal, sizeof(int)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief GetInternalClientName request. @@ -768,7 +785,8 @@ struct JackGetInternalClientNameRequest : public JackRequest CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fIntRefNum, sizeof(int)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief GetInternalClient result. @@ -800,7 +818,8 @@ struct JackGetInternalClientNameResult : public JackResult CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief InternalClientHandle request. @@ -832,7 +851,8 @@ struct JackInternalClientHandleRequest : public JackRequest CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief InternalClientHandle result. @@ -865,7 +885,8 @@ struct JackInternalClientHandleResult : public JackResult CheckRes(trans->Write(&fIntRefNum, sizeof(int))); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief InternalClientLoad request. @@ -912,7 +933,8 @@ struct JackInternalClientLoadRequest : public JackRequest CheckRes(trans->Write(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1)); return trans->Write(&fOptions, sizeof(int)); } -}; + +} POST_PACKED_STRUCTURE; /*! \brief InternalClientLoad result. @@ -945,7 +967,8 @@ struct JackInternalClientLoadResult : public JackResult CheckRes(trans->Write(&fIntRefNum, sizeof(int))); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief InternalClientUnload request. @@ -975,8 +998,7 @@ struct JackInternalClientUnloadRequest : public JackRequest CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fIntRefNum, sizeof(int)); } -}; - +} POST_PACKED_STRUCTURE; /*! \brief InternalClientLoad result. @@ -1006,7 +1028,8 @@ struct JackInternalClientUnloadResult : public JackResult CheckRes(trans->Write(&fStatus, sizeof(int))); return 0; } -}; + +} POST_PACKED_STRUCTURE; /*! \brief ClientNotification request. @@ -1042,7 +1065,7 @@ struct JackClientNotificationRequest : public JackRequest return 0; } -}; +} POST_PACKED_STRUCTURE; /*! \brief ClientNotification. @@ -1087,7 +1110,7 @@ struct JackClientNotification return 0; } -}; +} POST_PACKED_STRUCTURE; } // end of namespace diff --git a/common/JackShmMem.cpp b/common/JackShmMem.cpp index a6ec3159..5d68b86e 100644 --- a/common/JackShmMem.cpp +++ b/common/JackShmMem.cpp @@ -37,7 +37,7 @@ JackShmMem::JackShmMem() void JackShmMemAble::Init() { fInfo.index = gInfo.index; - fInfo.attached_at = gInfo.attached_at; + fInfo.ptr.attached_at = gInfo.ptr.attached_at; fInfo.size = gInfo.size; } @@ -71,9 +71,9 @@ void* JackShmMem::operator new(size_t size) // so use an intermediate global data gInfo.index = info.index; gInfo.size = size; - gInfo.attached_at = info.attached_at; + gInfo.ptr.attached_at = info.ptr.attached_at; - jack_log("JackShmMem::new index = %ld attached = %x size = %ld ", info.index, info.attached_at, size); + jack_log("JackShmMem::new index = %ld attached = %x size = %ld ", info.index, info.ptr.attached_at, size); return obj; error: @@ -86,7 +86,7 @@ void JackShmMem::operator delete(void* p, size_t size) jack_shm_info_t info; JackShmMem* obj = (JackShmMem*)p; info.index = obj->fInfo.index; - info.attached_at = obj->fInfo.attached_at; + info.ptr.attached_at = obj->fInfo.ptr.attached_at; jack_log("JackShmMem::delete size = %ld index = %ld", size, info.index); diff --git a/common/JackShmMem.h b/common/JackShmMem.h index 6a6261a2..5976c96d 100644 --- a/common/JackShmMem.h +++ b/common/JackShmMem.h @@ -102,7 +102,7 @@ class JackShmMemAble char* GetShmAddress() { - return (char*)fInfo.attached_at; + return (char*)fInfo.ptr.attached_at; } void LockMemory() @@ -173,7 +173,7 @@ class JackShmReadWritePtr JackShmReadWritePtr() { fInfo.index = -1; - fInfo.attached_at = NULL; + fInfo.ptr.attached_at = (char*)NULL; } JackShmReadWritePtr(int index, const char* server_name) @@ -192,12 +192,12 @@ class JackShmReadWritePtr T* operator->() const { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } operator T*() const { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } JackShmReadWritePtr& operator=(int index) @@ -218,7 +218,7 @@ class JackShmReadWritePtr T* GetShmAddress() { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } }; @@ -259,7 +259,7 @@ class JackShmReadWritePtr1 JackShmReadWritePtr1() { fInfo.index = -1; - fInfo.attached_at = NULL; + fInfo.ptr.attached_at = NULL; } JackShmReadWritePtr1(int index, const char* server_name) @@ -278,12 +278,12 @@ class JackShmReadWritePtr1 T* operator->() const { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } operator T*() const { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } JackShmReadWritePtr1& operator=(int index) @@ -304,7 +304,7 @@ class JackShmReadWritePtr1 T* GetShmAddress() { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } }; @@ -339,7 +339,7 @@ class JackShmReadPtr JackShmReadPtr() { fInfo.index = -1; - fInfo.attached_at = NULL; + fInfo.ptr.attached_at = NULL; } JackShmReadPtr(int index, const char* server_name) @@ -358,12 +358,12 @@ class JackShmReadPtr T* operator->() const { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } operator T*() const { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } JackShmReadPtr& operator=(int index) @@ -384,7 +384,7 @@ class JackShmReadPtr T* GetShmAddress() { - return (T*)fInfo.attached_at; + return (T*)fInfo.ptr.attached_at; } }; diff --git a/common/JackTransportEngine.h b/common/JackTransportEngine.h index 9602516d..2adac8b1 100644 --- a/common/JackTransportEngine.h +++ b/common/JackTransportEngine.h @@ -193,7 +193,7 @@ class SERVER_EXPORT JackTransportEngine : public JackAtomicArrayStateattached_at; + return (char*)si->ptr.attached_at; } void @@ -638,7 +638,7 @@ jack_access_registry (jack_shm_info_t *ri) return rc; } - if ((ri->attached_at = mmap (0, JACK_SHM_REGISTRY_SIZE, + if ((ri->ptr.attached_at = mmap (0, JACK_SHM_REGISTRY_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0)) == MAP_FAILED) { jack_error ("Cannot mmap shm registry segment (%s)", @@ -649,7 +649,7 @@ jack_access_registry (jack_shm_info_t *ri) /* set up global pointers */ ri->index = JACK_SHM_REGISTRY_INDEX; - jack_shm_header = ri->attached_at; + jack_shm_header = ri->ptr.attached_at; jack_shm_registry = (jack_shm_registry_t *) (jack_shm_header + 1); close (shm_fd); // steph @@ -694,7 +694,7 @@ jack_create_registry (jack_shm_info_t *ri) return rc; } - if ((ri->attached_at = mmap (0, JACK_SHM_REGISTRY_SIZE, + if ((ri->ptr.attached_at = mmap (0, JACK_SHM_REGISTRY_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0)) == MAP_FAILED) { jack_error ("Cannot mmap shm registry segment (%s)", @@ -706,7 +706,7 @@ jack_create_registry (jack_shm_info_t *ri) /* set up global pointers */ ri->index = JACK_SHM_REGISTRY_INDEX; - jack_shm_header = ri->attached_at; + jack_shm_header = ri->ptr.attached_at; jack_shm_registry = (jack_shm_registry_t *) (jack_shm_header + 1); /* initialize registry contents */ @@ -726,8 +726,8 @@ void jack_release_shm (jack_shm_info_t* si) { /* registry may or may not be locked */ - if (si->attached_at != MAP_FAILED) { - munmap (si->attached_at, jack_shm_registry[si->index].size); + if (si->ptr.attached_at != MAP_FAILED) { + munmap (si->ptr.attached_at, jack_shm_registry[si->index].size); } } @@ -781,7 +781,7 @@ jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* si) strncpy (registry->id, name, sizeof (registry->id)); registry->allocator = getpid(); si->index = registry->index; - si->attached_at = MAP_FAILED; /* not attached */ + si->ptr.attached_at = MAP_FAILED; /* not attached */ rc = 0; /* success */ unlock: @@ -802,7 +802,7 @@ jack_attach_shm (jack_shm_info_t* si) return -1; } - if ((si->attached_at = mmap (0, registry->size, PROT_READ|PROT_WRITE, + if ((si->ptr.attached_at = mmap (0, registry->size, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0)) == MAP_FAILED) { jack_error ("Cannot mmap shm segment %s (%s)", registry->id, @@ -828,7 +828,7 @@ jack_attach_shm_read (jack_shm_info_t* si) return -1; } - if ((si->attached_at = mmap (0, registry->size, PROT_READ, + if ((si->ptr.attached_at = mmap (0, registry->size, PROT_READ, MAP_SHARED, shm_fd, 0)) == MAP_FAILED) { jack_error ("Cannot mmap shm segment %s (%s)", registry->id, diff --git a/common/shm.h b/common/shm.h index a3d9f34f..c0ad91b6 100644 --- a/common/shm.h +++ b/common/shm.h @@ -35,7 +35,7 @@ extern "C" #ifndef SHM_NAME_MAX #define SHM_NAME_MAX NAME_MAX #endif - typedef char shm_name_t[SHM_NAME_MAX]; + typedef char shm_name_t[SHM_NAME_MAX]; typedef shm_name_t jack_shm_id_t; #elif WIN32 // steph TO CHECK @@ -43,7 +43,7 @@ extern "C" #ifndef SHM_NAME_MAX #define SHM_NAME_MAX NAME_MAX #endif - typedef char shm_name_t[SHM_NAME_MAX]; + typedef char shm_name_t[SHM_NAME_MAX]; typedef shm_name_t jack_shm_id_t; #else @@ -73,7 +73,6 @@ extern "C" #ifdef WIN32 int pid; /* process ID */ #else - pid_t pid; /* process ID */ #endif @@ -96,10 +95,8 @@ extern "C" jack_shm_registry_index_t index; /* offset into the registry */ #ifdef WIN32 - int allocator; /* PID that created shm segment */ #else - pid_t allocator; /* PID that created shm segment */ #endif @@ -118,12 +115,16 @@ extern "C" * indicating where the shared memory has been * attached to the address space. */ + typedef struct _jack_shm_info { jack_shm_registry_index_t index; /* offset into the registry */ - size_t size; - void *attached_at; /* address where attached */ + 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 */ } - jack_shm_info_t; + POST_PACKED_STRUCTURE jack_shm_info_t; /* utility functions used only within JACK */ diff --git a/posix/JackCompilerDeps_os.h b/posix/JackCompilerDeps_os.h index d7d10992..26c8f0b0 100644 --- a/posix/JackCompilerDeps_os.h +++ b/posix/JackCompilerDeps_os.h @@ -20,7 +20,25 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef __JackCompilerDeps_POSIX__ #define __JackCompilerDeps_POSIX__ +#include "JackConstants.h" + #if __GNUC__ + #ifndef POST_PACKED_STRUCTURE + /* 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. + */ + #if (__GNUC__< 4) /* On Solaris, 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 EXPORT __attribute__((visibility("default"))) #ifdef SERVER_SIDE @@ -36,6 +54,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #define MEM_ALIGN(x,y) x #define EXPORT #define SERVER_EXPORT + /* Add other things here for non-gcc platforms for POST_PACKED_STRUCTURE */ #endif #endif diff --git a/wscript b/wscript index 4fef3251..d2321d6b 100644 --- a/wscript +++ b/wscript @@ -64,6 +64,7 @@ def set_options(opt): opt.add_option('--dbus', action='store_true', default=False, help='Enable D-Bus JACK (jackdbus)') opt.add_option('--doxygen', action='store_true', default=False, help='Enable build of doxygen documentation') opt.add_option('--profile', action='store_true', default=False, help='Build with engine profiling') + opt.add_option('--mixed', action='store_true', default=False, help='Build with 32/64 mixed mode') opt.add_option('--clients', default=64, type="int", dest="clients", help='Maximum number of JACK clients') opt.add_option('--ports', default=1024, type="int", dest="ports", help='Maximum number of ports') opt.add_option('--clients', default=64, type="int", dest="clients", help='Maximum number of JACK clients') @@ -120,6 +121,7 @@ def configure(conf): conf.env['BUILD_DOXYGEN_DOCS'] = Options.options.doxygen conf.env['BUILD_WITH_PROFILE'] = Options.options.profile + conf.env['BUILD_WITH_32_64'] = Options.options.mixed if Options.options.libdir: conf.env['LIBDIR'] = Options.options.libdir @@ -137,6 +139,8 @@ def configure(conf): conf.define('JACK_DBUS', 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 @@ -163,6 +167,7 @@ def configure(conf): display_msg("Drivers directory", conf.env['ADDON_DIR'], 'CYAN') display_feature('Build doxygen documentation', conf.env['BUILD_DOXYGEN_DOCS']) display_feature('Build with engine profiling', conf.env['BUILD_WITH_PROFILE']) + display_feature('Build with 32/64 mixed mode', conf.env['BUILD_WITH_32_64']) if conf.env['IS_LINUX']: