static void
si_async_workunit_release(si_async_workunit_t *r)
{
	if (r == NULL) return;

	if (OSAtomicDecrement32Barrier(&(r->refcount)) != 0) return;

#ifdef CALL_TRACE
	fprintf(stderr, "** %s freeing worklist item %p\n", __func__, r);
#endif

	si_async_worklist_remove_unit(r);

	if (r->resitem != NULL) si_item_release(r->resitem);
	if (r->reslist != NULL) si_list_release(r->reslist);

	if (r->str1 != NULL) free(r->str1);
	if (r->str2 != NULL) free(r->str2);
	if (r->str3 != NULL) free(r->str3);

	/* release send-once right if it has not been used */
	if (r->send != MACH_PORT_NULL) mach_port_deallocate(mach_task_self(), r->send);

	/* release receive right */
	mach_port_mod_refs(mach_task_self(), r->port, MACH_PORT_RIGHT_RECEIVE, -1);

	free(r);
}
void BufferManager::GetFFTOutput( Float32* outFFTData )
{
    mFFTHelper->ComputeFFT(mFFTInputBuffer, outFFTData);
    mFFTInputBufferFrameIndex = 0;
    OSAtomicDecrement32Barrier(&mHasNewFFTData);
    OSAtomicIncrement32Barrier(&mNeedsNewFFTData);
}
U_CAPI int32_t U_EXPORT2
umtx_atomic_dec(int32_t *p) {
    int32_t retVal;
    if (pDecFn) {
        retVal = (*pDecFn)(gIncDecContext, p);
    } else {
        #if !ICU_USE_THREADS
            /* ICU thread support compiled out. */
            retVal = --(*p);
        #elif U_PLATFORM_HAS_WIN32_API
            retVal = InterlockedDecrement((LONG*)p);
        #elif defined(USE_MAC_OS_ATOMIC_INCREMENT)
            retVal = OSAtomicDecrement32Barrier(p);
        #elif (U_HAVE_GCC_ATOMICS == 1)
            retVal = __sync_sub_and_fetch(p, 1);
        #elif defined (POSIX)
            umtx_lock(&gIncDecMutex);
            retVal = --(*p);
            umtx_unlock(&gIncDecMutex);
        #else
            /* Unknown Platform. */
            retVal = --(*p);
        #endif
    }
    return retVal;
}
/**
 * Retain or release the list for reading. This method is async-safe.
 *
 * This must be issued prior to attempting to iterate the list, and must called again once reads have completed.
 *
 * @param enable If true, the list will be retained. If false, released.
 */
template <typename V> void async_list<V>::set_reading (bool enable) {
    if (enable) {
        /* Increment and issue a barrier. Once issued, no items will be deallocated while a reference is held. */
        OSAtomicIncrement32Barrier(&_refcount);
    } else {
        /* Increment and issue a barrier. Once issued, items may again be deallocated. */
        OSAtomicDecrement32Barrier(&_refcount);
    }
}
Exemple #5
0
//------------------------------------------------------------------------
int32 FAtomicDecrement (volatile int32& var)
{
#if WINDOWS
	return InterlockedExchangeAdd (&var, -1);
#elif MAC
	return OSAtomicDecrement32Barrier (NATIVE_ATOMIC_TYPE &var) + 1;
#else
	return var--;
#endif
}
void FFTBufferManager::GrabAudioData(AudioBufferList *inBL)
{
	if (mAudioBufferSize < inBL->mBuffers[0].mDataByteSize)	return;
	
	UInt32 bytesToCopy = min(inBL->mBuffers[0].mDataByteSize, mAudioBufferSize - mAudioBufferCurrentIndex);
	memcpy(mAudioBuffer+mAudioBufferCurrentIndex, inBL->mBuffers[0].mData, bytesToCopy);
	
	mAudioBufferCurrentIndex += bytesToCopy / sizeof(int32_t);
	if (mAudioBufferCurrentIndex >= mAudioBufferSize / sizeof(int32_t))
	{
		OSAtomicIncrement32Barrier(&mHasAudioData);
		OSAtomicDecrement32Barrier(&mNeedsAudioData);
	}
}
void FFTBufferManager::GrabAudioData2(SInt16 *samples,int nb)
{
//	if (mAudioBufferSize < inBL->mBuffers[0].mDataByteSize)	return;
	
	UInt32 bytesToCopy = min(nb, mAudioBufferSize - mAudioBufferCurrentIndex);
	memcpy(mAudioBuffer+mAudioBufferCurrentIndex, samples, bytesToCopy);
	
	mAudioBufferCurrentIndex += bytesToCopy / sizeof(int32_t);
	if (mAudioBufferCurrentIndex >= mAudioBufferSize / sizeof(int32_t))
	{
		OSAtomicIncrement32Barrier(&mHasAudioData);
		OSAtomicDecrement32Barrier(&mNeedsAudioData);
	}
}
Boolean	FFTBufferManager::ComputeFFT(int32_t *outFFTData, float_t *outMajorPitch)
{
	if (HasNewAudioData())
	{
		SpectrumAnalysisProcess(mSpectrumAnalysis, mAudioBuffer, outFFTData, outMajorPitch, true);		
		OSAtomicDecrement32Barrier(&mHasAudioData);
		OSAtomicIncrement32Barrier(&mNeedsAudioData);
		mAudioBufferCurrentIndex = 0;
		return true;
	}
	else if (mNeedsAudioData == 0)
		OSAtomicIncrement32Barrier(&mNeedsAudioData);
	
	return false;
}
void BufferManager::GetFFTOutput( Float32* outFFTData )
{
    if (HasNewFFTData())
    {
        Float32* _FFTBuffer = GetFFTBuffers();
        _WaveFFTCepstrumHelper->ComputeABSFFT(_FFTBuffer, outFFTData);
        
        ManageFFTBuffer();
        
        free(_FFTBuffer);
        
        OSAtomicDecrement32Barrier(&_HasNewFFTData);
        OSAtomicIncrement32Barrier(&_NeedsNewFFTData);
    }
}
Exemple #10
0
    int AtomicRefCount::decrement()
    {
#if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
      return (int) ::InterlockedDecrement( (volatile LONG*)&m_count );
#elif defined( __APPLE__ )
      return (int) OSAtomicDecrement32Barrier( (volatile int32_t*)&m_count );
#elif defined( HAVE_GCC_ATOMIC_BUILTINS )
      // Use the gcc intrinsic for atomic decrement if supported.
      return (int) __sync_sub_and_fetch( &m_count, 1 );
#else
      // Fallback to using a lock
      MutexGuard m( m_lock );
      return --m_count;
#endif
    }
void
si_module_release(si_mod_t *si)
{
	int32_t i;

	if (si == NULL) return;
	if (si->flags & SI_MOD_FLAG_STATIC) return;

	i = OSAtomicDecrement32Barrier(&si->refcount);
	if (i > 0) return;

	pthread_mutex_lock(&module_mutex);

	for (i = 0; (i < module_count) && (module_list[i] != si); i++);
	if (i >= module_count)
	{
		pthread_mutex_unlock(&module_mutex);
		return;
	}

	if (module_count == 1)
	{
		free(module_list);
		module_list = NULL;
		module_count = 0;
		pthread_mutex_unlock(&module_mutex);
		return;
	}

	for (i++; i < module_count; i++) module_list[i - 1] = module_list[i];
	module_count--;
	module_list = (si_mod_t **)reallocf(module_list, module_count * sizeof(si_mod_t *));
	if (module_list == NULL) module_count = 0;

	pthread_mutex_unlock(&module_mutex);

	if (si->vtable->sim_close != NULL) si->vtable->sim_close(si);
	if (si->bundle != NULL) dlclose(si->bundle);
	free(si->name);
	free(si);
}
Exemple #12
0
U_CAPI int32_t U_EXPORT2
umtx_atomic_dec(int32_t *p) {
    int32_t retVal;
    if (pDecFn) {
        retVal = (*pDecFn)(gIncDecContext, p);
    } else {
        #if defined (U_WINDOWS) && ICU_USE_THREADS == 1
            retVal = InterlockedDecrement((LONG*)p);
        #elif defined(USE_MAC_OS_ATOMIC_INCREMENT)
            retVal = OSAtomicDecrement32Barrier(p);
        #elif defined (POSIX) && ICU_USE_THREADS == 1
            umtx_lock(&gIncDecMutex);
            retVal = --(*p);
            umtx_unlock(&gIncDecMutex);
        #else
            /* Unknown Platform, or ICU thread support compiled out. */
            retVal = --(*p);
        #endif
    }
    return retVal;
}
void RefCounted::unrefer()
{
#ifdef _WINDOWS
  if (InterlockedDecrement(&(this->mRefCount)) <= 0)
  {
    delete this;
  }
#else
#ifdef MACOSX
  if (OSAtomicDecrement32Barrier(&(this->mRefCount)) <= 0)
  {
    delete this;
  }
#else
  dlib::auto_mutex lock(sRefMutex);
  if (--mRefCount <= 0)
  {
    delete this;
  }
#endif
#endif
}
Boolean	FFTBufferManager::ComputeFFT(int32_t *outFFTData)
{
	if (HasNewAudioData())
	{
//        for(int i=0;i<mFFTLength;i++)
//        {
//            if(mAudioBuffer[i]>0.15)
//            printf("%f\n",mAudioBuffer[i]);
//        }
        //Generate a split complex vector from the real data
# define NOISE_FILTER 0.01;
        for(int i=0;i<4096;i++)
        {
            
            //DENOISE
            if(mAudioBuffer[i]>0)
            {
                mAudioBuffer[i] -= NOISE_FILTER;
                if(mAudioBuffer[i] < 0)
                {
                    mAudioBuffer[i] = 0;
                }
            }
            else if(mAudioBuffer[i]<0)
            {
                mAudioBuffer[i] += NOISE_FILTER;
                if(mAudioBuffer[i]>0)
                {
                    mAudioBuffer[i] = 0;
                }
            }
            else
            {
                mAudioBuffer[i] = 0;         
            }
            
        }

        
        
        
        vDSP_ctoz((COMPLEX *)mAudioBuffer, 2, &mDspSplitComplex, 1, mFFTLength);
        
        //Take the fft and scale appropriately
        vDSP_fft_zrip(mSpectrumAnalysis, &mDspSplitComplex, 1, mLog2N, kFFTDirection_Forward);
        vDSP_vsmul(mDspSplitComplex.realp, 1, &mFFTNormFactor, mDspSplitComplex.realp, 1, mFFTLength);
        vDSP_vsmul(mDspSplitComplex.imagp, 1, &mFFTNormFactor, mDspSplitComplex.imagp, 1, mFFTLength);
        
        //Zero out the nyquist value
        mDspSplitComplex.imagp[0] = 0.0;
        
        //Convert the fft data to dB
        Float32 tmpData[mFFTLength];
        vDSP_zvmags(&mDspSplitComplex, 1, tmpData, 1, mFFTLength);
        
        //In order to avoid taking log10 of zero, an adjusting factor is added in to make the minimum value equal -128dB
        vDSP_vsadd(tmpData, 1, &mAdjust0DB, tmpData, 1, mFFTLength);
        Float32 one = 1;
        vDSP_vdbcon(tmpData, 1, &one, tmpData, 1, mFFTLength, 0);
        
        //Convert floating point data to integer (Q7.24)
        vDSP_vsmul(tmpData, 1, &m24BitFracScale, tmpData, 1, mFFTLength);
        for(UInt32 i=0; i<mFFTLength; ++i)
            outFFTData[i] = (SInt32) tmpData[i];
        
        for(int i=0;i<mFFTLength/4;i++)
        {
            
                printf("%i:::%i\n",i,outFFTData[i]/16777216+120);
        }
        OSAtomicDecrement32Barrier(&mHasAudioData);
		OSAtomicIncrement32Barrier(&mNeedsAudioData);
		mAudioBufferCurrentIndex = 0;
		return true;
	}
	else if (mNeedsAudioData == 0)
		OSAtomicIncrement32Barrier(&mNeedsAudioData);
	
	return false;
}
int32_t TS_AtomicDec(TS_Atomic32 * aToDec){
  return OSAtomicDecrement32Barrier(aToDec);
}