Use Windows CRITICAL_SECTION instead of using pthread and fix a possible crash with DirectShow capture device which can output a zero length frame. JNIs need to be recompiled on Windows.

cusax-fix
Sebastien Vincent 16 years ago
parent 0f86e48b6a
commit 4820ad003d

@ -377,8 +377,7 @@
<!-- Windows specific flags -->
<compilerarg value="-I${system.JAVA_HOME}/include" if="is.running.windows" />
<compilerarg value="-I${system.JAVA_HOME}/include/win32" if="is.running.windows" />
<compilerarg value="-I${pthread}" if="is.running.windows" />
<linkerarg value="-L${pthread}" if="is.running.windows" />
<linkerarg value="-ojportaudio.dll" if="is.running.windows" />
<linkerarg value="-Wl,--kill-at" if="is.running.windows" />
@ -387,7 +386,6 @@
<linkerarg value="-lspeexdsp" location="end" if="is.running.windows" />
<linkerarg value="-lwinmm" location="end" if="is.running.windows" />
<linkerarg value="-lm" location="end" if="is.running.windows" />
<linkerarg value="-lpthreadGC2" location="end" if="is.running.windows" />
<linkerarg value="-lstdc++" location="end" if="is.running.windows" />
<linkerarg value="-lole32" location="end" if="is.running.windows" />
<linkerarg value="-luuid" location="end" if="is.running.windows" />
@ -595,7 +593,6 @@
<echo message="-Dffmpeg: path to ffmpeg directory (ffmpeg JNI compilation)." />
<echo message="-Dportaudio path to portaudio directory (jportaudio JNI compilation)." />
<echo message="-Dspeex: path to speex directory (jportaudio/jspeex JNI compilation)." />
<echo message="-Dpthread: path to pthread directory (Windows only). If you already have pthread in MinGW don't use it." />
<echo message="" />
<echo message="Please note that external libraries such as ffmpeg, x264, portaudio and speex have to be compiled" />
<echo message="(follow READMEs in relevant directory) before trying to compile libffmpeg and libjportaudio" />

@ -34,8 +34,14 @@ static void AudioQualityImprovement_setFrameSize
static void AudioQualityImprovement_updatePreprocess
(AudioQualityImprovement *audioQualityImprovement);
#ifndef _WIN32
static pthread_mutex_t AudioQualityImprovement_sharedInstancesMutex
= PTHREAD_MUTEX_INITIALIZER;
#else /* Windows */
static CRITICAL_SECTION AudioQualityImprovement_sharedInstancesMutex = {0};
static int initialized = 0;
#endif
static AudioQualityImprovement *AudioQualityImprovement_sharedInstances
= NULL;
@ -70,7 +76,7 @@ static void
AudioQualityImprovement_free(AudioQualityImprovement *audioQualityImprovement)
{
/* mutex */
pthread_mutex_destroy(audioQualityImprovement->mutex);
mutex_destroy(audioQualityImprovement->mutex);
free(audioQualityImprovement->mutex);
/* preprocess */
if (audioQualityImprovement->preprocess)
@ -98,7 +104,15 @@ AudioQualityImprovement_getSharedInstance(const char *stringID, jlong longID)
{
AudioQualityImprovement *theSharedInstance = NULL;
if (!pthread_mutex_lock(&AudioQualityImprovement_sharedInstancesMutex))
#ifdef _WIN32
if(!initialized)
{
mutex_init(&AudioQualityImprovement_sharedInstancesMutex, NULL);
initialized = 1;
}
#endif
if (!mutex_lock(&AudioQualityImprovement_sharedInstancesMutex))
{
AudioQualityImprovement *aSharedInstance
= AudioQualityImprovement_sharedInstances;
@ -126,7 +140,7 @@ AudioQualityImprovement_getSharedInstance(const char *stringID, jlong longID)
if (theSharedInstance)
AudioQualityImprovement_sharedInstances = theSharedInstance;
}
pthread_mutex_unlock(&AudioQualityImprovement_sharedInstancesMutex);
mutex_unlock(&AudioQualityImprovement_sharedInstancesMutex);
}
return theSharedInstance;
}
@ -156,9 +170,9 @@ AudioQualityImprovement_new
return NULL;
}
/* mutex */
audioQualityImprovement->mutex = malloc(sizeof(pthread_mutex_t));
audioQualityImprovement->mutex = malloc(sizeof(Mutex));
if (!(audioQualityImprovement->mutex)
|| pthread_mutex_init(audioQualityImprovement->mutex, NULL))
|| mutex_init(audioQualityImprovement->mutex, NULL))
{
AudioQualityImprovement_free(audioQualityImprovement);
return NULL;
@ -186,7 +200,7 @@ void AudioQualityImprovement_process
{
if ((sampleSizeInBits == 16)
&& (channels == 1)
&& !pthread_mutex_lock(audioQualityImprovement->mutex))
&& !mutex_lock(audioQualityImprovement->mutex))
{
switch (sampleOrigin)
{
@ -228,7 +242,7 @@ void AudioQualityImprovement_process
}
break;
}
pthread_mutex_unlock(audioQualityImprovement->mutex);
mutex_unlock(audioQualityImprovement->mutex);
}
}
@ -236,9 +250,9 @@ void
AudioQualityImprovement_release
(AudioQualityImprovement *audioQualityImprovement)
{
if (!pthread_mutex_lock(&AudioQualityImprovement_sharedInstancesMutex))
if (!mutex_lock(&AudioQualityImprovement_sharedInstancesMutex))
{
if (!pthread_mutex_lock(audioQualityImprovement->mutex))
if (!mutex_lock(audioQualityImprovement->mutex))
{
--(audioQualityImprovement->retainCount);
if (audioQualityImprovement->retainCount < 1)
@ -269,13 +283,13 @@ AudioQualityImprovement_release
}
}
pthread_mutex_unlock(audioQualityImprovement->mutex);
mutex_unlock(audioQualityImprovement->mutex);
AudioQualityImprovement_free(audioQualityImprovement);
}
else
pthread_mutex_unlock(audioQualityImprovement->mutex);
mutex_unlock(audioQualityImprovement->mutex);
}
pthread_mutex_unlock(&AudioQualityImprovement_sharedInstancesMutex);
mutex_unlock(&AudioQualityImprovement_sharedInstancesMutex);
}
}
static void
@ -364,10 +378,10 @@ static void
AudioQualityImprovement_retain
(AudioQualityImprovement *audioQualityImprovement)
{
if (!pthread_mutex_lock(audioQualityImprovement->mutex))
if (!mutex_lock(audioQualityImprovement->mutex))
{
++(audioQualityImprovement->retainCount);
pthread_mutex_unlock(audioQualityImprovement->mutex);
mutex_unlock(audioQualityImprovement->mutex);
}
}
@ -375,14 +389,14 @@ void
AudioQualityImprovement_setDenoise
(AudioQualityImprovement *audioQualityImprovement, jboolean denoise)
{
if (!pthread_mutex_lock(audioQualityImprovement->mutex))
if (!mutex_lock(audioQualityImprovement->mutex))
{
if (audioQualityImprovement->denoise != denoise)
{
audioQualityImprovement->denoise = denoise;
AudioQualityImprovement_updatePreprocess(audioQualityImprovement);
}
pthread_mutex_unlock(audioQualityImprovement->mutex);
mutex_unlock(audioQualityImprovement->mutex);
}
}
@ -393,7 +407,7 @@ AudioQualityImprovement_setEchoFilterLengthInMillis
{
if (echoFilterLengthInMillis < 0)
echoFilterLengthInMillis = 0;
if (!pthread_mutex_lock(audioQualityImprovement->mutex))
if (!mutex_lock(audioQualityImprovement->mutex))
{
if (audioQualityImprovement->echoFilterLengthInMillis
!= echoFilterLengthInMillis)
@ -402,7 +416,7 @@ AudioQualityImprovement_setEchoFilterLengthInMillis
= echoFilterLengthInMillis;
AudioQualityImprovement_updatePreprocess(audioQualityImprovement);
}
pthread_mutex_unlock(audioQualityImprovement->mutex);
mutex_unlock(audioQualityImprovement->mutex);
}
}
@ -421,14 +435,14 @@ void
AudioQualityImprovement_setSampleRate
(AudioQualityImprovement *audioQualityImprovement, int sampleRate)
{
if (!pthread_mutex_lock(audioQualityImprovement->mutex))
if (!mutex_lock(audioQualityImprovement->mutex))
{
if (audioQualityImprovement->sampleRate != sampleRate)
{
audioQualityImprovement->sampleRate = sampleRate;
AudioQualityImprovement_updatePreprocess(audioQualityImprovement);
}
pthread_mutex_unlock(audioQualityImprovement->mutex);
mutex_unlock(audioQualityImprovement->mutex);
}
}

@ -13,7 +13,65 @@
#ifndef AUDIO_QUALITY_IMPROVEMENT_IMPLEMENTATION
typedef void *AudioQualityImprovement;
#else /* #ifndef AUDIO_QUALITY_IMPROVEMENT_IMPLEMENTATION */
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
typedef CRITICAL_SECTION Mutex;
static inline int mutex_init(Mutex* mutex, void* arg)
{
InitializeCriticalSection(mutex);
arg = NULL; /* unused */
return 0;
}
static inline int mutex_destroy(Mutex* mutex)
{
DeleteCriticalSection(mutex);
return 0;
}
static inline int mutex_lock(Mutex* mutex)
{
EnterCriticalSection(mutex);
return 0;
}
static inline int mutex_unlock(Mutex* mutex)
{
LeaveCriticalSection(mutex);
return 0;
}
#else /* Unix */
#include <pthread.h>
typedef pthread_mutex_t Mutex;
static inline int mutex_init(Mutex* mutex, void* arg)
{
return pthread_mutex_init(mutex, arg);
}
static inline int mutex_destroy(Mutex* mutex)
{
return pthread_mutex_destroy(mutex);
}
static inline int mutex_lock(Mutex* mutex)
{
return pthread_mutex_lock(mutex);
}
static inline int mutex_unlock(Mutex* mutex)
{
return pthread_mutex_unlock(mutex);
return 0;
}
#endif
#include <speex/speex_echo.h>
#include <speex/speex_preprocess.h>
#include <speex/speex_resampler.h>
@ -27,7 +85,7 @@ typedef struct _AudioQualityImprovement
jint frameSize;
int frameSizeOfPreprocess;
jlong longID;
pthread_mutex_t *mutex;
Mutex *mutex;
struct _AudioQualityImprovement *next;
spx_int16_t *out;
spx_uint32_t outCapacity;

@ -98,6 +98,11 @@ public:
sample->GetPointer(&data);
length = sample->GetActualDataLength();
if(length == 0)
{
return S_OK;
}
if(!m_bytes || m_bytesLength < length)
{
if(m_bytes)

Loading…
Cancel
Save