From 8d0ec2403f3444e3a53d16b21f2f8557abd71b55 Mon Sep 17 00:00:00 2001 From: John Emmas Date: Tue, 6 May 2014 09:31:11 +0100 Subject: [PATCH] Add a couple of pthread helper macros (to accommodate the fact that in ptw-win32, 'pthread_t' is subtlely different from its non-Windows counterparts) --- .../devicemanager/WCMRNativeAudio.cpp | 14 ++++--- .../wavesapi/miscutils/pthread_utils.h | 38 +++++++++++++++++++ libs/pbd/MSVCpbd/pbd.vcproj | 4 ++ libs/pbd/pbd/pthread_utils.h | 15 ++++++++ 4 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 libs/backends/wavesaudio/wavesapi/miscutils/pthread_utils.h diff --git a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp index 14cb1dd124..642ea22de1 100644 --- a/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp +++ b/libs/backends/wavesaudio/wavesapi/devicemanager/WCMRNativeAudio.cpp @@ -12,6 +12,7 @@ #endif #include "WCMRNativeAudio.h" +#include "MiscUtils/pthread_utils.h" #include "MiscUtils/safe_delete.h" #include #include @@ -33,11 +34,12 @@ //********************************************************************************************** WCMRNativeAudioNoneDevice::WCMRNativeAudioNoneDevice (WCMRAudioDeviceManager *pManager) : WCMRNativeAudioDevice (pManager, false /*useMultiThreading*/) - , m_SilenceThread(0) #if defined (PLATFORM_WINDOWS) , _waitableTimerForUsleep (CreateWaitableTimer(NULL, TRUE, NULL)) #endif { + mark_pthread_inactive (m_SilenceThread); + m_DeviceName = NONE_DEVICE_NAME; m_SamplingRates = boost::assign::list_of (m_CurrentSamplingRate=44100)(48000)(88200)(96000); @@ -136,7 +138,7 @@ WTErr WCMRNativeAudioNoneDevice::SetStreaming (bool newState) if (Streaming()) { - if (m_SilenceThread) + if (is_pthread_active (m_SilenceThread)) std::cerr << "\t\t\t\t\t !!!!!!!!!!!!!!! Warning: the inactive NONE-DEVICE was streaming!" << std::endl; pthread_attr_t attributes; @@ -155,19 +157,19 @@ WTErr WCMRNativeAudioNoneDevice::SetStreaming (bool newState) } if (pthread_create (&m_SilenceThread, &attributes, __SilenceThread, this)) { - m_SilenceThread = 0; + mark_pthread_inactive (m_SilenceThread); std::cerr << "WCMRNativeAudioNoneDevice::SetStreaming (): pthread_create () failed!" << std::endl; return eGenericErr; } } else { - if (!m_SilenceThread) + if (!is_pthread_active (m_SilenceThread)) { std::cerr << "\t\t\t\t\t !!!!!!!!!!!!!!! Warning: the active NONE-DEVICE was NOT streaming!" << std::endl; } - while (m_SilenceThread) + while (is_pthread_active (m_SilenceThread)) { _usleep(1); //now wait for ended thread; } @@ -219,7 +221,7 @@ void WCMRNativeAudioNoneDevice::_SilenceThread() } audioCallbackData.acdCycleStartTimeNanos = cycleEndTimeNanos+1; } - m_SilenceThread = 0; + mark_pthread_inactive (m_SilenceThread); } void* WCMRNativeAudioNoneDevice::__SilenceThread(void *This) diff --git a/libs/backends/wavesaudio/wavesapi/miscutils/pthread_utils.h b/libs/backends/wavesaudio/wavesapi/miscutils/pthread_utils.h new file mode 100644 index 0000000000..825405d02e --- /dev/null +++ b/libs/backends/wavesaudio/wavesapi/miscutils/pthread_utils.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2014 John Emmas + + 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 __waves_pthread_utils__ +#define __waves_pthread_utils__ + +/* Accommodate thread setting (and testing) for both + * 'libpthread' and 'libpthread_win32' (whose implementations + * of 'pthread_t' are subtlely different) + */ +#ifndef PTHREAD_MACROS_DEFINED +#define PTHREAD_MACROS_DEFINED +#ifdef PTW32_VERSION /* pthread_win32 */ +#define mark_pthread_inactive(threadID) threadID.p=0 +#define is_pthread_active(threadID) threadID.p==0 +#else /* normal pthread */ +#define mark_pthread_inactive(threadID) threadID=0 +#define is_pthread_active(threadID) threadID==0 +#endif /* PTW32_VERSION */ + +#endif /* PTHREAD_MACROS_DEFINED */ +#endif /* __waves_pthread_utils__ */ diff --git a/libs/pbd/MSVCpbd/pbd.vcproj b/libs/pbd/MSVCpbd/pbd.vcproj index 62da682c38..6c57c84239 100644 --- a/libs/pbd/MSVCpbd/pbd.vcproj +++ b/libs/pbd/MSVCpbd/pbd.vcproj @@ -723,6 +723,10 @@ RelativePath="..\pbd\property_basics.h" > + + diff --git a/libs/pbd/pbd/pthread_utils.h b/libs/pbd/pbd/pthread_utils.h index 37ce723715..ee78819d59 100644 --- a/libs/pbd/pbd/pthread_utils.h +++ b/libs/pbd/pbd/pthread_utils.h @@ -20,6 +20,21 @@ #ifndef __pbd_pthread_utils__ #define __pbd_pthread_utils__ +/* Accommodate thread setting (and testing) for both + * 'libpthread' and 'libpthread_win32' (whose implementations + * of 'pthread_t' are subtlely different) + */ +#ifndef PTHREAD_MACROS_DEFINED +#define PTHREAD_MACROS_DEFINED +#ifdef PTW32_VERSION /* pthread_win32 */ +#define mark_pthread_inactive(threadID) threadID.p=0 +#define is_pthread_active(threadID) threadID.p==0 +#else /* normal pthread */ +#define mark_pthread_inactive(threadID) threadID=0 +#define is_pthread_active(threadID) threadID==0 +#endif /* PTW32_VERSION */ +#endif /* PTHREAD_MACROS_DEFINED */ + #ifdef COMPILER_MSVC #include #else