added accelerate vdsp FFT support and use it on iOS
This commit is contained in:
		@@ -179,7 +179,9 @@ inline REALTYPE profile(REALTYPE fi, REALTYPE bwi) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
inline void spectrum_copy(int nfreq, REALTYPE* freq1, REALTYPE* freq2)
 | 
					inline void spectrum_copy(int nfreq, REALTYPE* freq1, REALTYPE* freq2)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	for (int i = 0; i<nfreq; i++) freq2[i] = freq1[i];
 | 
					    //for (int i = 0; i<nfreq; i++) freq2[i] = freq1[i];
 | 
				
			||||||
 | 
					    FloatVectorOperations::copy(freq2, freq1, nfreq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,17 @@
 | 
				
			|||||||
	Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
						Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					#define VIMAGE_H // crazy hack needed
 | 
				
			||||||
 | 
					#include <Accelerate/Accelerate.h>
 | 
				
			||||||
 | 
					//#include <vForce.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Stretch.h"
 | 
					#include "Stretch.h"
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FFT::FFT(int nsamples_, bool no_inverse)
 | 
					FFT::FFT(int nsamples_, bool no_inverse)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    nsamples=nsamples_;
 | 
					    nsamples=nsamples_;
 | 
				
			||||||
@@ -41,6 +48,19 @@ FFT::FFT(int nsamples_, bool no_inverse)
 | 
				
			|||||||
	data.resize(nsamples,true);
 | 
						data.resize(nsamples,true);
 | 
				
			||||||
	bool allow_long_planning = false; // g_propsfile->getBoolValue("fftw_allow_long_planning", false);
 | 
						bool allow_long_planning = false; // g_propsfile->getBoolValue("fftw_allow_long_planning", false);
 | 
				
			||||||
    //double t0 = Time::getMillisecondCounterHiRes();
 | 
					    //double t0 = Time::getMillisecondCounterHiRes();
 | 
				
			||||||
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					    int maxlog2N = 1;
 | 
				
			||||||
 | 
					    while ((1 << maxlog2N) < nsamples)
 | 
				
			||||||
 | 
					        ++maxlog2N;
 | 
				
			||||||
 | 
					    log2N = maxlog2N;
 | 
				
			||||||
 | 
					    planfft = vDSP_create_fftsetup(maxlog2N, kFFTRadix2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_workReal.resize(nsamples,false);
 | 
				
			||||||
 | 
					    m_workImag.resize(nsamples,false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //Logger::writeToLog("fftsize: "  + String(nsamples) + " log2N: " + String(log2N));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    if (allow_long_planning)
 | 
					    if (allow_long_planning)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        //fftwf_plan_with_nthreads(2);
 | 
					        //fftwf_plan_with_nthreads(2);
 | 
				
			||||||
@@ -55,6 +75,8 @@ FFT::FFT(int nsamples_, bool no_inverse)
 | 
				
			|||||||
        if (no_inverse == false)
 | 
					        if (no_inverse == false)
 | 
				
			||||||
			planifftw=fftwf_plan_r2r_1d(nsamples,data.data(),data.data(),FFTW_HC2R,FFTW_ESTIMATE);
 | 
								planifftw=fftwf_plan_r2r_1d(nsamples,data.data(),data.data(),FFTW_HC2R,FFTW_ESTIMATE);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //double t1 = Time::getMillisecondCounterHiRes();
 | 
					    //double t1 = Time::getMillisecondCounterHiRes();
 | 
				
			||||||
    //Logger::writeToLog("Creating FFTW3 plans took "+String(t1-t0)+ "ms");
 | 
					    //Logger::writeToLog("Creating FFTW3 plans took "+String(t1-t0)+ "ms");
 | 
				
			||||||
	static int seed = 0;
 | 
						static int seed = 0;
 | 
				
			||||||
@@ -64,46 +86,123 @@ FFT::FFT(int nsamples_, bool no_inverse)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
FFT::~FFT()
 | 
					FFT::~FFT()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	fftwf_destroy_plan(planfftw);
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					    vDSP_destroy_fftsetup((FFTSetup)planfft);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    fftwf_destroy_plan(planfftw);
 | 
				
			||||||
	if (planifftw!=nullptr)
 | 
						if (planifftw!=nullptr)
 | 
				
			||||||
		fftwf_destroy_plan(planifftw);
 | 
							fftwf_destroy_plan(planifftw);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void FFT::smp2freq()
 | 
					void FFT::smp2freq()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (int i=0;i<nsamples;i++)
 | 
					    const int halfsamples = nsamples / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    COMPLEX_SPLIT A;
 | 
				
			||||||
 | 
					    A.realp = m_workReal.data();
 | 
				
			||||||
 | 
					    A.imagp = m_workImag.data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // apply window
 | 
				
			||||||
 | 
					    //vDSP_vmul(gInFIFO, 1, mWindow, 1, gFFTworksp, 1, fftFrameSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //convert real input to even-odd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vDSP_ctoz((COMPLEX*)smp.data(), 2, &A, 1, halfsamples);
 | 
				
			||||||
 | 
					    //memset(ioData->mBuffers[0].mData, 0, ioData->mBuffers[0].mDataByteSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // forward fft
 | 
				
			||||||
 | 
					    vDSP_fft_zrip((FFTSetup)planfft, &A, 1, log2N, FFT_FORWARD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // result is in split packed complex A.realp[0] is DC, A.imagp[0] is NY, so we zero NY before doing mag^2
 | 
				
			||||||
 | 
					    A.imagp[0] = 0.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //DebugLogC("post fft: %g %g\n", A.realp[fftFrameSize/4], A.imagp[fftFrameSize/4 + 1]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Absolute square (equivalent to mag^2)
 | 
				
			||||||
 | 
					    vDSP_zvmags(&A, 1, freq.data(), 1, halfsamples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // take square root
 | 
				
			||||||
 | 
					    //vvsqrtf(freq.data(), freq.data(), &halfsamples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i=1; i < halfsamples;i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        freq[i]=sqrt(freq[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    freq[0] = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i=0;i<nsamples;i++)
 | 
				
			||||||
        data[i]=smp[i];
 | 
					        data[i]=smp[i];
 | 
				
			||||||
	fftwf_execute(planfftw);
 | 
					    fftwf_execute(planfftw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (int i=1;i<nsamples/2;i++)
 | 
					    for (int i=1;i<nsamples/2;i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		REALTYPE c=data[i];
 | 
					        REALTYPE c=data[i];
 | 
				
			||||||
		REALTYPE s=data[nsamples-i];
 | 
					        REALTYPE s=data[nsamples-i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		freq[i]=sqrt(c*c+s*s);
 | 
					        freq[i]=sqrt(c*c+s*s);
 | 
				
			||||||
	};
 | 
					    };
 | 
				
			||||||
	freq[0]=0.0;
 | 
					    freq[0]=0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void FFT::freq2smp()
 | 
					void FFT::freq2smp()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	REALTYPE inv_2p15_2pi=1.0f/16384.0f*(float)c_PI;
 | 
						const REALTYPE inv_2p15_2pi=1.0f/16384.0f*(float)c_PI;
 | 
				
			||||||
	for (int i=1;i<nsamples/2;i++)
 | 
					
 | 
				
			||||||
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					    const int halfsamples = nsamples / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    COMPLEX_SPLIT A;
 | 
				
			||||||
 | 
					    A.realp = m_workReal.data();
 | 
				
			||||||
 | 
					    A.imagp = m_workImag.data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i=1;i<nsamples/2;i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
		unsigned int rand = m_randdist(m_randgen);
 | 
					        unsigned int rand = m_randdist(m_randgen);
 | 
				
			||||||
 | 
					        REALTYPE phase = rand*inv_2p15_2pi;
 | 
				
			||||||
 | 
					        m_workReal[i] = freq[i]*cos(phase);
 | 
				
			||||||
 | 
					        m_workImag[i] = freq[i]*sin(phase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    m_workReal[0] = m_workImag[0] = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // inverse fft
 | 
				
			||||||
 | 
					    vDSP_fft_zrip((FFTSetup)planfft, &A, 1, log2N, FFT_INVERSE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // unpack
 | 
				
			||||||
 | 
					    vDSP_ztoc(&A, 1, (COMPLEX*)data.data(), 2, halfsamples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // scale
 | 
				
			||||||
 | 
					    //float scale = 1.f/data[0]; // 1.0f / nsamples  ??
 | 
				
			||||||
 | 
					    float scale = 1.f / nsamples; // 1.0f / nsamples  ??
 | 
				
			||||||
 | 
					    vDSP_vsmul(data.data(), 1, &scale, smp.data(), 1, nsamples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    for (int i=1;i<nsamples/2;i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        unsigned int rand = m_randdist(m_randgen);
 | 
				
			||||||
        REALTYPE phase=rand*inv_2p15_2pi;
 | 
					        REALTYPE phase=rand*inv_2p15_2pi;
 | 
				
			||||||
        data[i]=freq[i]*cos(phase);
 | 
					        data[i]=freq[i]*cos(phase);
 | 
				
			||||||
        data[nsamples-i]=freq[i]*sin(phase);
 | 
					        data[nsamples-i]=freq[i]*sin(phase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	};
 | 
					    };
 | 
				
			||||||
	data[0]=data[nsamples/2+1]=data[nsamples/2]=0.0;
 | 
					    data[0]=data[nsamples/2+1]=data[nsamples/2]=0.0;
 | 
				
			||||||
	fftwf_execute(planifftw);
 | 
					
 | 
				
			||||||
 | 
					    fftwf_execute(planifftw);
 | 
				
			||||||
	for (int i=0;i<nsamples;i++)
 | 
						for (int i=0;i<nsamples;i++)
 | 
				
			||||||
        smp[i]=data[i]/nsamples;
 | 
					        smp[i]=data[i]/nsamples;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void FFT::applywindow(FFTWindow type)
 | 
					void FFT::applywindow(FFTWindow type)
 | 
				
			||||||
@@ -129,7 +228,9 @@ void FFT::applywindow(FFTWindow type)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
	for (int i=0;i<nsamples;i++) smp[i]*=window.data[i];
 | 
					
 | 
				
			||||||
 | 
					    //for (int i=0;i<nsamples;i++) smp[i]*=window.data[i];
 | 
				
			||||||
 | 
					    FloatVectorOperations::multiply(smp.data(), window.data.data(), nsamples);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Stretch::Stretch(REALTYPE rap_,int /*bufsize_*/,FFTWindow w,bool bypass_,REALTYPE samplerate_,int /*stereo_mode_*/)
 | 
					Stretch::Stretch(REALTYPE rap_,int /*bufsize_*/,FFTWindow w,bool bypass_,REALTYPE samplerate_,int /*stereo_mode_*/)
 | 
				
			||||||
@@ -160,22 +261,35 @@ void Stretch::set_rap(REALTYPE newrap){
 | 
				
			|||||||
		
 | 
							
 | 
				
			||||||
void Stretch::do_analyse_inbuf(REALTYPE *smps){
 | 
					void Stretch::do_analyse_inbuf(REALTYPE *smps){
 | 
				
			||||||
	//get the frequencies
 | 
						//get the frequencies
 | 
				
			||||||
	for (int i=0;i<bufsize;i++) {
 | 
					
 | 
				
			||||||
 | 
					    FloatVectorOperations::copy(infft->smp.data(), old_smps.data(), bufsize);
 | 
				
			||||||
 | 
					    FloatVectorOperations::copy(infft->smp.data()+bufsize, smps, bufsize);
 | 
				
			||||||
 | 
					    FloatVectorOperations::copy(old_freq.data(), infft->freq.data(), bufsize);
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    for (int i=0;i<bufsize;i++) {
 | 
				
			||||||
		infft->smp[i]=old_smps[i];
 | 
							infft->smp[i]=old_smps[i];
 | 
				
			||||||
		infft->smp[i+bufsize]=smps[i];
 | 
							infft->smp[i+bufsize]=smps[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		old_freq[i]=infft->freq[i];
 | 
							old_freq[i]=infft->freq[i];
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	infft->applywindow(window_type);
 | 
						infft->applywindow(window_type);
 | 
				
			||||||
	infft->smp2freq();
 | 
						infft->smp2freq();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Stretch::do_next_inbuf_smps(REALTYPE *smps){
 | 
					void Stretch::do_next_inbuf_smps(REALTYPE *smps){
 | 
				
			||||||
	for (int i=0;i<bufsize;i++) {
 | 
					    FloatVectorOperations::copy(very_old_smps.data(), old_smps.data(), bufsize);
 | 
				
			||||||
 | 
					    FloatVectorOperations::copy(old_smps.data(), new_smps.data(), bufsize);
 | 
				
			||||||
 | 
					    FloatVectorOperations::copy(new_smps.data(), smps, bufsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    for (int i=0;i<bufsize;i++) {
 | 
				
			||||||
		very_old_smps[i]=old_smps[i];
 | 
							very_old_smps[i]=old_smps[i];
 | 
				
			||||||
		old_smps[i]=new_smps[i];
 | 
							old_smps[i]=new_smps[i];
 | 
				
			||||||
		new_smps[i]=smps[i];
 | 
							new_smps[i]=smps[i];
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
REALTYPE Stretch::do_detect_onset(){
 | 
					REALTYPE Stretch::do_detect_onset(){
 | 
				
			||||||
@@ -249,7 +363,8 @@ REALTYPE Stretch::process(REALTYPE *smps,int nsmps)
 | 
				
			|||||||
	jassert(bufsize > 0);
 | 
						jassert(bufsize > 0);
 | 
				
			||||||
	REALTYPE onset=0.0;
 | 
						REALTYPE onset=0.0;
 | 
				
			||||||
	if (bypass){
 | 
						if (bypass){
 | 
				
			||||||
		for (int i=0;i<bufsize;i++) out_buf[i]=smps[i];
 | 
					        //for (int i=0;i<bufsize;i++) out_buf[i]=smps[i];
 | 
				
			||||||
 | 
					        FloatVectorOperations::copy(out_buf.data(), smps, bufsize);
 | 
				
			||||||
		return 0.0;
 | 
							return 0.0;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -279,13 +394,23 @@ REALTYPE Stretch::process(REALTYPE *smps,int nsmps)
 | 
				
			|||||||
		//construct the input fft
 | 
							//construct the input fft
 | 
				
			||||||
		int start_pos=(int)(floor(remained_samples*bufsize));	
 | 
							int start_pos=(int)(floor(remained_samples*bufsize));	
 | 
				
			||||||
		if (start_pos>=bufsize) start_pos=bufsize-1;
 | 
							if (start_pos>=bufsize) start_pos=bufsize-1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        FloatVectorOperations::copy(fft->smp.data(), very_old_smps.data() + start_pos, bufsize-start_pos);
 | 
				
			||||||
 | 
					        FloatVectorOperations::copy(fft->smp.data() + (bufsize - start_pos), old_smps.data() , bufsize);
 | 
				
			||||||
 | 
					        FloatVectorOperations::copy(fft->smp.data() + (2*bufsize - start_pos), new_smps.data() , start_pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
		for (int i=0;i<bufsize-start_pos;i++) fft->smp[i]=very_old_smps[i+start_pos];
 | 
							for (int i=0;i<bufsize-start_pos;i++) fft->smp[i]=very_old_smps[i+start_pos];
 | 
				
			||||||
		for (int i=0;i<bufsize;i++) fft->smp[i+bufsize-start_pos]=old_smps[i];
 | 
							for (int i=0;i<bufsize;i++) fft->smp[i+bufsize-start_pos]=old_smps[i];
 | 
				
			||||||
		for (int i=0;i<start_pos;i++) fft->smp[i+2*bufsize-start_pos]=new_smps[i];
 | 
							for (int i=0;i<start_pos;i++) fft->smp[i+2*bufsize-start_pos]=new_smps[i];
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//compute the output spectrum
 | 
							//compute the output spectrum
 | 
				
			||||||
		fft->applywindow(window_type);
 | 
							fft->applywindow(window_type);
 | 
				
			||||||
		fft->smp2freq();
 | 
							fft->smp2freq();
 | 
				
			||||||
		for (int i=0;i<bufsize;i++) outfft->freq[i]=fft->freq[i];
 | 
					
 | 
				
			||||||
 | 
					        //for (int i=0;i<bufsize;i++) outfft->freq[i]=fft->freq[i];
 | 
				
			||||||
 | 
					        FloatVectorOperations::copy(outfft->freq.data(), fft->freq.data(), bufsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -310,7 +435,8 @@ REALTYPE Stretch::process(REALTYPE *smps,int nsmps)
 | 
				
			|||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//copy the current output buffer to old buffer
 | 
							//copy the current output buffer to old buffer
 | 
				
			||||||
		for (int i=0;i<bufsize*2;i++) old_out_smps[i]=outfft->smp[i];
 | 
					        //for (int i=0;i<bufsize*2;i++) old_out_smps[i]=outfft->smp[i];
 | 
				
			||||||
 | 
					        FloatVectorOperations::copy(old_out_smps.data(), outfft->smp.data(), 2*bufsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,13 +22,20 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "globals.h"
 | 
					#include "globals.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "fftw3.h"
 | 
					#ifndef PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					#define PS_USE_VDSP_FFT 0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include "fftw3.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../JuceLibraryCode/JuceHeader.h"
 | 
					#include "../JuceLibraryCode/JuceHeader.h"
 | 
				
			||||||
#include <random>
 | 
					#include <random>
 | 
				
			||||||
#include <type_traits>
 | 
					#include <type_traits>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename T>
 | 
					template<typename T>
 | 
				
			||||||
class FFTWBuffer
 | 
					class FFTWBuffer
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -94,19 +101,34 @@ private:
 | 
				
			|||||||
    int m_size = 0;
 | 
					    int m_size = 0;
 | 
				
			||||||
    void mallocimpl(T*& buf,int size)
 | 
					    void mallocimpl(T*& buf,int size)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					        // malloc aligns properly on vdsp platforms
 | 
				
			||||||
 | 
					        if constexpr (std::is_same<T,float>::value)
 | 
				
			||||||
 | 
					            buf = (float*)malloc(size*sizeof(float));
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            buf = (double*)malloc(size * sizeof(double));
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
        if constexpr (std::is_same<T,float>::value)
 | 
					        if constexpr (std::is_same<T,float>::value)
 | 
				
			||||||
			buf = (float*)fftwf_malloc(size*sizeof(float));
 | 
								buf = (float*)fftwf_malloc(size*sizeof(float));
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			buf = (double*)fftw_malloc(size * sizeof(double));
 | 
								buf = (double*)fftw_malloc(size * sizeof(double));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
	void freeimpl(T*& buf)
 | 
						void freeimpl(T*& buf)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (buf!=nullptr)
 | 
					        if (buf!=nullptr)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
			if constexpr (std::is_same<T, float>::value)
 | 
								if constexpr (std::is_same<T, float>::value)
 | 
				
			||||||
				fftwf_free(buf);
 | 
									free(buf);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				fftw_free(buf);
 | 
									free(buf);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					            if constexpr (std::is_same<T, float>::value)
 | 
				
			||||||
 | 
					                fftwf_free(buf);
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                fftw_free(buf);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
			buf = nullptr;
 | 
								buf = nullptr;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -132,7 +154,14 @@ class FFT
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fftwf_plan planfftw,planifftw;
 | 
					#if PS_USE_VDSP_FFT
 | 
				
			||||||
 | 
					        void * planfft;
 | 
				
			||||||
 | 
					        int log2N;
 | 
				
			||||||
 | 
					        FFTWBuffer<REALTYPE> m_workReal;
 | 
				
			||||||
 | 
					        FFTWBuffer<REALTYPE> m_workImag;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        fftwf_plan planfftw,planifftw;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        FFTWBuffer<REALTYPE> data;
 | 
					        FFTWBuffer<REALTYPE> data;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		struct{
 | 
							struct{
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										71
									
								
								Source/power.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								Source/power.svg
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<svg
 | 
				
			||||||
 | 
					   inkscape:export-ydpi="9"
 | 
				
			||||||
 | 
					   inkscape:export-xdpi="9"
 | 
				
			||||||
 | 
					   inkscape:export-filename="/Users/jesse/src/sonobus/images/person.png"
 | 
				
			||||||
 | 
					   inkscape:version="1.1 (c4e8f9e, 2021-05-24)"
 | 
				
			||||||
 | 
					   sodipodi:docname="power.svg"
 | 
				
			||||||
 | 
					   xml:space="preserve"
 | 
				
			||||||
 | 
					   viewBox="0 0 512 512"
 | 
				
			||||||
 | 
					   height="512px"
 | 
				
			||||||
 | 
					   width="512px"
 | 
				
			||||||
 | 
					   y="0px"
 | 
				
			||||||
 | 
					   x="0px"
 | 
				
			||||||
 | 
					   id="Layer_1"
 | 
				
			||||||
 | 
					   version="1.1"
 | 
				
			||||||
 | 
					   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
				
			||||||
 | 
					   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
				
			||||||
 | 
					   xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns:svg="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
				
			||||||
 | 
					   xmlns:cc="http://creativecommons.org/ns#"
 | 
				
			||||||
 | 
					   xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
 | 
				
			||||||
 | 
					     id="defs5984" /><sodipodi:namedview
 | 
				
			||||||
 | 
					     inkscape:current-layer="Layer_1"
 | 
				
			||||||
 | 
					     inkscape:window-maximized="0"
 | 
				
			||||||
 | 
					     inkscape:window-y="468"
 | 
				
			||||||
 | 
					     inkscape:window-x="1916"
 | 
				
			||||||
 | 
					     inkscape:cy="198.26548"
 | 
				
			||||||
 | 
					     inkscape:cx="241.87026"
 | 
				
			||||||
 | 
					     inkscape:zoom="0.73386453"
 | 
				
			||||||
 | 
					     showgrid="false"
 | 
				
			||||||
 | 
					     id="namedview5982"
 | 
				
			||||||
 | 
					     inkscape:window-height="677"
 | 
				
			||||||
 | 
					     inkscape:window-width="1256"
 | 
				
			||||||
 | 
					     inkscape:pageshadow="2"
 | 
				
			||||||
 | 
					     inkscape:pageopacity="0"
 | 
				
			||||||
 | 
					     guidetolerance="10"
 | 
				
			||||||
 | 
					     gridtolerance="10"
 | 
				
			||||||
 | 
					     objecttolerance="10"
 | 
				
			||||||
 | 
					     borderopacity="1"
 | 
				
			||||||
 | 
					     bordercolor="#666666"
 | 
				
			||||||
 | 
					     pagecolor="#ffffff"
 | 
				
			||||||
 | 
					     inkscape:document-rotation="0"
 | 
				
			||||||
 | 
					     showguides="true"
 | 
				
			||||||
 | 
					     inkscape:guide-bbox="true"
 | 
				
			||||||
 | 
					     inkscape:pagecheckerboard="1" /><rect
 | 
				
			||||||
 | 
					     y="2.7346985"
 | 
				
			||||||
 | 
					     x="-2.7346985"
 | 
				
			||||||
 | 
					     height="512"
 | 
				
			||||||
 | 
					     width="512"
 | 
				
			||||||
 | 
					     id="rect8965"
 | 
				
			||||||
 | 
					     style="fill:#000000;fill-opacity:0;stroke-width:15" /><path
 | 
				
			||||||
 | 
					     id="path5975"
 | 
				
			||||||
 | 
					     d="M 256,256 Z" /><metadata
 | 
				
			||||||
 | 
					     id="metadata5979"><rdf:RDF><rdf:Description
 | 
				
			||||||
 | 
					         dc:language="en"
 | 
				
			||||||
 | 
					         dc:format="image/svg+xml"
 | 
				
			||||||
 | 
					         dc:date="2017-09-24"
 | 
				
			||||||
 | 
					         dc:publisher="Iconscout"
 | 
				
			||||||
 | 
					         dc:description="ios,person,outline"
 | 
				
			||||||
 | 
					         dc:title="ios,person,outline"
 | 
				
			||||||
 | 
					         about="https://iconscout.com/legal#licenses"><dc:creator><rdf:Bag><rdf:li>Benjamin J Sperry</rdf:li></rdf:Bag></dc:creator></rdf:Description><cc:Work
 | 
				
			||||||
 | 
					         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
 | 
				
			||||||
 | 
					           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><path
 | 
				
			||||||
 | 
					     d="M 256,464 C 141.31,464 48,370.53 48,255.65 48,193.2 75.25,134.65 122.76,95.100001 A 22,22 0 1 1 150.93,128.9 C 113.48,160.1 92,206.3 92,255.65 92,346.27 165.57,420 256,420 346.43,420 420,346.27 420,255.65 A 164,164 0 0 0 360.17,129 22,22 0 1 1 388.17,95.080001 207.88,207.88 0 0 1 464,255.65 C 464,370.53 370.69,464 256,464 Z"
 | 
				
			||||||
 | 
					     id="path4469"
 | 
				
			||||||
 | 
					     style="fill:#b2b2b2;fill-opacity:1;stroke:none;stroke-opacity:1" /><path
 | 
				
			||||||
 | 
					     d="m 256,188 c -12.15026,0 -22,-9.84974 -22,-22 V 70.000001 c 0,-12.150273 9.84974,-21.99999 22,-21.99999 12.15026,0 22,9.849717 22,21.99999 V 166 c 0,12.15026 -9.84974,22 -22,22 z"
 | 
				
			||||||
 | 
					     id="path4471"
 | 
				
			||||||
 | 
					     style="fill:#b2b2b2;fill-opacity:1;stroke:none;stroke-opacity:1"
 | 
				
			||||||
 | 
					     sodipodi:nodetypes="sssssss" /></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 3.0 KiB  | 
							
								
								
									
										72
									
								
								Source/power_sel.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								Source/power_sel.svg
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<svg
 | 
				
			||||||
 | 
					   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
				
			||||||
 | 
					   xmlns:cc="http://creativecommons.org/ns#"
 | 
				
			||||||
 | 
					   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
				
			||||||
 | 
					   xmlns:svg="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
				
			||||||
 | 
					   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
				
			||||||
 | 
					   version="1.1"
 | 
				
			||||||
 | 
					   id="Layer_1"
 | 
				
			||||||
 | 
					   x="0px"
 | 
				
			||||||
 | 
					   y="0px"
 | 
				
			||||||
 | 
					   width="512px"
 | 
				
			||||||
 | 
					   height="512px"
 | 
				
			||||||
 | 
					   viewBox="0 0 512 512"
 | 
				
			||||||
 | 
					   xml:space="preserve"
 | 
				
			||||||
 | 
					   sodipodi:docname="power_sel.svg"
 | 
				
			||||||
 | 
					   inkscape:version="1.0 (4035a4f, 2020-05-01)"
 | 
				
			||||||
 | 
					   inkscape:export-filename="/Users/jesse/src/sonobus/images/person.png"
 | 
				
			||||||
 | 
					   inkscape:export-xdpi="9"
 | 
				
			||||||
 | 
					   inkscape:export-ydpi="9"><defs
 | 
				
			||||||
 | 
					     id="defs5984" /><sodipodi:namedview
 | 
				
			||||||
 | 
					     inkscape:guide-bbox="true"
 | 
				
			||||||
 | 
					     showguides="true"
 | 
				
			||||||
 | 
					     inkscape:document-rotation="0"
 | 
				
			||||||
 | 
					     pagecolor="#ffffff"
 | 
				
			||||||
 | 
					     bordercolor="#666666"
 | 
				
			||||||
 | 
					     borderopacity="1"
 | 
				
			||||||
 | 
					     objecttolerance="10"
 | 
				
			||||||
 | 
					     gridtolerance="10"
 | 
				
			||||||
 | 
					     guidetolerance="10"
 | 
				
			||||||
 | 
					     inkscape:pageopacity="0"
 | 
				
			||||||
 | 
					     inkscape:pageshadow="2"
 | 
				
			||||||
 | 
					     inkscape:window-width="1000"
 | 
				
			||||||
 | 
					     inkscape:window-height="677"
 | 
				
			||||||
 | 
					     id="namedview5982"
 | 
				
			||||||
 | 
					     showgrid="false"
 | 
				
			||||||
 | 
					     inkscape:zoom="0.31557847"
 | 
				
			||||||
 | 
					     inkscape:cx="215.97553"
 | 
				
			||||||
 | 
					     inkscape:cy="339.55745"
 | 
				
			||||||
 | 
					     inkscape:window-x="2365"
 | 
				
			||||||
 | 
					     inkscape:window-y="560"
 | 
				
			||||||
 | 
					     inkscape:window-maximized="0"
 | 
				
			||||||
 | 
					     inkscape:current-layer="Layer_1" /><rect
 | 
				
			||||||
 | 
					     style="fill:#000000;fill-opacity:0;stroke-width:15"
 | 
				
			||||||
 | 
					     id="rect8965"
 | 
				
			||||||
 | 
					     width="512"
 | 
				
			||||||
 | 
					     height="512"
 | 
				
			||||||
 | 
					     x="-2.7346985"
 | 
				
			||||||
 | 
					     y="2.7346985" /><path
 | 
				
			||||||
 | 
					     d="M 256,256 Z"
 | 
				
			||||||
 | 
					     id="path5975" /><metadata
 | 
				
			||||||
 | 
					     id="metadata5979"><rdf:RDF><rdf:Description
 | 
				
			||||||
 | 
					         about="https://iconscout.com/legal#licenses"
 | 
				
			||||||
 | 
					         dc:title="ios,person,outline"
 | 
				
			||||||
 | 
					         dc:description="ios,person,outline"
 | 
				
			||||||
 | 
					         dc:publisher="Iconscout"
 | 
				
			||||||
 | 
					         dc:date="2017-09-24"
 | 
				
			||||||
 | 
					         dc:format="image/svg+xml"
 | 
				
			||||||
 | 
					         dc:language="en"><dc:creator><rdf:Bag><rdf:li>Benjamin J Sperry</rdf:li></rdf:Bag></dc:creator></rdf:Description><cc:Work
 | 
				
			||||||
 | 
					         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
 | 
				
			||||||
 | 
					           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><g
 | 
				
			||||||
 | 
					     style="stroke:none;stroke-opacity:1;fill:#7dc5f8;fill-opacity:1"
 | 
				
			||||||
 | 
					     transform="translate(-98.9038,78.548099)"
 | 
				
			||||||
 | 
					     id="g5080"><path
 | 
				
			||||||
 | 
					       style="stroke:none;stroke-opacity:1;fill:#7dc5f8;fill-opacity:1"
 | 
				
			||||||
 | 
					       id="path4469"
 | 
				
			||||||
 | 
					       d="m 354.9038,385.4519 c -114.69,0 -208,-93.47 -208,-208.35 0,-62.45 27.25,-120.999998 74.76,-160.549998 a 22,22 0 1 1 28.17,33.8 c -37.45,31.2 -58.93,77.399998 -58.93,126.749998 0,90.62 73.57,164.35 164,164.35 90.43,0 164,-73.73 164,-164.35 a 164,164 0 0 0 -59.83,-126.649998 22,22 0 1 1 28,-33.92 207.88,207.88 0 0 1 75.83,160.569998 c 0,114.88 -93.31,208.35 -208,208.35 z" /><path
 | 
				
			||||||
 | 
					       style="stroke:none;stroke-opacity:1;fill:#7dc5f8;fill-opacity:1"
 | 
				
			||||||
 | 
					       id="path4471"
 | 
				
			||||||
 | 
					       d="m 354.9038,193.4519 a 22,22 0 0 1 -22,-22 V -8.5480978 a 22,22 0 0 1 44,0 V 171.4519 a 22,22 0 0 1 -22,22 z" /></g></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 3.1 KiB  | 
@@ -15,28 +15,6 @@
 | 
				
			|||||||
              jucerFormatVersion="1" useAppConfig="0" defines="JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1">
 | 
					              jucerFormatVersion="1" useAppConfig="0" defines="JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1">
 | 
				
			||||||
  <MAINGROUP id="nozXHl" name="PaulXStretch">
 | 
					  <MAINGROUP id="nozXHl" name="PaulXStretch">
 | 
				
			||||||
    <GROUP id="{03DA6B32-F666-FF60-F168-4385D0847058}" name="Source">
 | 
					    <GROUP id="{03DA6B32-F666-FF60-F168-4385D0847058}" name="Source">
 | 
				
			||||||
      <FILE id="H0XjG1" name="CrossPlatformUtilsIOS.mm" compile="1" resource="0"
 | 
					 | 
				
			||||||
            file="Source/CrossPlatformUtilsIOS.mm"/>
 | 
					 | 
				
			||||||
      <FILE id="RsxiMD" name="CustomStandaloneFilterApp.cpp" compile="1"
 | 
					 | 
				
			||||||
            resource="0" file="Source/CustomStandaloneFilterApp.cpp"/>
 | 
					 | 
				
			||||||
      <FILE id="EUS9Ff" name="CustomStandaloneFilterWindow.h" compile="0"
 | 
					 | 
				
			||||||
            resource="0" file="Source/CustomStandaloneFilterWindow.h"/>
 | 
					 | 
				
			||||||
      <FILE id="rHA1fu" name="CustomLookAndFeel.cpp" compile="1" resource="0"
 | 
					 | 
				
			||||||
            file="Source/CustomLookAndFeel.cpp"/>
 | 
					 | 
				
			||||||
      <FILE id="Y4DgKq" name="CustomLookAndFeel.h" compile="0" resource="0"
 | 
					 | 
				
			||||||
            file="Source/CustomLookAndFeel.h"/>
 | 
					 | 
				
			||||||
      <FILE id="zvau5B" name="CrossPlatformUtils.h" compile="0" resource="0"
 | 
					 | 
				
			||||||
            file="Source/CrossPlatformUtils.h"/>
 | 
					 | 
				
			||||||
      <FILE id="fjYsFD" name="CrossPlatformUtilsMac.mm" compile="1" resource="0"
 | 
					 | 
				
			||||||
            file="Source/CrossPlatformUtilsMac.mm"/>
 | 
					 | 
				
			||||||
      <FILE id="RanaVV" name="RenderSettingsComponent.cpp" compile="1" resource="0"
 | 
					 | 
				
			||||||
            file="Source/RenderSettingsComponent.cpp"/>
 | 
					 | 
				
			||||||
      <FILE id="Mz5aVb" name="envelope_component.cpp" compile="1" resource="0"
 | 
					 | 
				
			||||||
            file="Source/envelope_component.cpp"/>
 | 
					 | 
				
			||||||
      <FILE id="apM6W6" name="envelope_component.h" compile="0" resource="0"
 | 
					 | 
				
			||||||
            file="Source/envelope_component.h"/>
 | 
					 | 
				
			||||||
      <FILE id="qfCc8R" name="jcdp_envelope.h" compile="0" resource="0" file="Source/jcdp_envelope.h"/>
 | 
					 | 
				
			||||||
      <FILE id="TDOHpE" name="resample.cpp" compile="1" resource="0" file="Source/WDL/resample.cpp"/>
 | 
					 | 
				
			||||||
      <GROUP id="{3B6D1AF9-E53E-2F78-24A5-D12A34009E6A}" name="PS_Source">
 | 
					      <GROUP id="{3B6D1AF9-E53E-2F78-24A5-D12A34009E6A}" name="PS_Source">
 | 
				
			||||||
        <FILE id="gDsFRp" name="globals.h" compile="0" resource="0" file="Source/PS_Source/globals.h"/>
 | 
					        <FILE id="gDsFRp" name="globals.h" compile="0" resource="0" file="Source/PS_Source/globals.h"/>
 | 
				
			||||||
        <FILE id="MOQjrp" name="ProcessedStretch.h" compile="0" resource="0"
 | 
					        <FILE id="MOQjrp" name="ProcessedStretch.h" compile="0" resource="0"
 | 
				
			||||||
@@ -51,26 +29,51 @@
 | 
				
			|||||||
        <FILE id="a7ur6I" name="StretchSource.cpp" compile="1" resource="0"
 | 
					        <FILE id="a7ur6I" name="StretchSource.cpp" compile="1" resource="0"
 | 
				
			||||||
              file="Source/PS_Source/StretchSource.cpp"/>
 | 
					              file="Source/PS_Source/StretchSource.cpp"/>
 | 
				
			||||||
      </GROUP>
 | 
					      </GROUP>
 | 
				
			||||||
      <FILE id="KcXfhC" name="ps3_BufferingAudioSource.cpp" compile="1" resource="0"
 | 
					      <FILE id="zvau5B" name="CrossPlatformUtils.h" compile="0" resource="0"
 | 
				
			||||||
            file="Source/ps3_BufferingAudioSource.cpp"/>
 | 
					            file="Source/CrossPlatformUtils.h"/>
 | 
				
			||||||
      <FILE id="oWbh5E" name="ps3_BufferingAudioSource.h" compile="0" resource="0"
 | 
					      <FILE id="H0XjG1" name="CrossPlatformUtilsIOS.mm" compile="1" resource="0"
 | 
				
			||||||
            file="Source/ps3_BufferingAudioSource.h"/>
 | 
					            file="Source/CrossPlatformUtilsIOS.mm"/>
 | 
				
			||||||
 | 
					      <FILE id="fjYsFD" name="CrossPlatformUtilsMac.mm" compile="1" resource="0"
 | 
				
			||||||
 | 
					            file="Source/CrossPlatformUtilsMac.mm"/>
 | 
				
			||||||
 | 
					      <FILE id="rHA1fu" name="CustomLookAndFeel.cpp" compile="1" resource="0"
 | 
				
			||||||
 | 
					            file="Source/CustomLookAndFeel.cpp"/>
 | 
				
			||||||
 | 
					      <FILE id="Y4DgKq" name="CustomLookAndFeel.h" compile="0" resource="0"
 | 
				
			||||||
 | 
					            file="Source/CustomLookAndFeel.h"/>
 | 
				
			||||||
 | 
					      <FILE id="RsxiMD" name="CustomStandaloneFilterApp.cpp" compile="1"
 | 
				
			||||||
 | 
					            resource="0" file="Source/CustomStandaloneFilterApp.cpp"/>
 | 
				
			||||||
 | 
					      <FILE id="EUS9Ff" name="CustomStandaloneFilterWindow.h" compile="0"
 | 
				
			||||||
 | 
					            resource="0" file="Source/CustomStandaloneFilterWindow.h"/>
 | 
				
			||||||
 | 
					      <FILE id="Mz5aVb" name="envelope_component.cpp" compile="1" resource="0"
 | 
				
			||||||
 | 
					            file="Source/envelope_component.cpp"/>
 | 
				
			||||||
 | 
					      <FILE id="apM6W6" name="envelope_component.h" compile="0" resource="0"
 | 
				
			||||||
 | 
					            file="Source/envelope_component.h"/>
 | 
				
			||||||
 | 
					      <FILE id="qfCc8R" name="jcdp_envelope.h" compile="0" resource="0" file="Source/jcdp_envelope.h"/>
 | 
				
			||||||
 | 
					      <FILE id="lyNyYp" name="PluginEditor.cpp" compile="1" resource="0"
 | 
				
			||||||
 | 
					            file="Source/PluginEditor.cpp"/>
 | 
				
			||||||
 | 
					      <FILE id="IO7X2q" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
 | 
				
			||||||
      <FILE id="jdPS0A" name="PluginProcessor.cpp" compile="1" resource="0"
 | 
					      <FILE id="jdPS0A" name="PluginProcessor.cpp" compile="1" resource="0"
 | 
				
			||||||
            file="Source/PluginProcessor.cpp"/>
 | 
					            file="Source/PluginProcessor.cpp"/>
 | 
				
			||||||
      <FILE id="pt5tX8" name="PluginProcessor.h" compile="0" resource="0"
 | 
					      <FILE id="pt5tX8" name="PluginProcessor.h" compile="0" resource="0"
 | 
				
			||||||
            file="Source/PluginProcessor.h"/>
 | 
					            file="Source/PluginProcessor.h"/>
 | 
				
			||||||
      <FILE id="lyNyYp" name="PluginEditor.cpp" compile="1" resource="0"
 | 
					      <FILE id="HtOPrw" name="power.svg" compile="0" resource="1" file="Source/power.svg"/>
 | 
				
			||||||
            file="Source/PluginEditor.cpp"/>
 | 
					      <FILE id="TY7Im1" name="power_sel.svg" compile="0" resource="1" file="Source/power_sel.svg"/>
 | 
				
			||||||
      <FILE id="IO7X2q" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
 | 
					      <FILE id="KcXfhC" name="ps3_BufferingAudioSource.cpp" compile="1" resource="0"
 | 
				
			||||||
 | 
					            file="Source/ps3_BufferingAudioSource.cpp"/>
 | 
				
			||||||
 | 
					      <FILE id="oWbh5E" name="ps3_BufferingAudioSource.h" compile="0" resource="0"
 | 
				
			||||||
 | 
					            file="Source/ps3_BufferingAudioSource.h"/>
 | 
				
			||||||
 | 
					      <FILE id="RanaVV" name="RenderSettingsComponent.cpp" compile="1" resource="0"
 | 
				
			||||||
 | 
					            file="Source/RenderSettingsComponent.cpp"/>
 | 
				
			||||||
 | 
					      <FILE id="L4CoFz" name="RenderSettingsComponent.h" compile="0" resource="0"
 | 
				
			||||||
 | 
					            file="Source/RenderSettingsComponent.h"/>
 | 
				
			||||||
 | 
					      <FILE id="TDOHpE" name="resample.cpp" compile="1" resource="0" file="Source/WDL/resample.cpp"/>
 | 
				
			||||||
    </GROUP>
 | 
					    </GROUP>
 | 
				
			||||||
  </MAINGROUP>
 | 
					  </MAINGROUP>
 | 
				
			||||||
  <EXPORTFORMATS>
 | 
					  <EXPORTFORMATS>
 | 
				
			||||||
    <XCODE_IPHONE targetFolder="Builds/iOS" externalLibraries="fftw3f" iosDevelopmentTeamID="XCS435894D"
 | 
					    <XCODE_IPHONE targetFolder="Builds/iOS" iosDevelopmentTeamID="XCS435894D" microphonePermissionNeeded="1"
 | 
				
			||||||
                  microphonePermissionNeeded="1" iosBackgroundAudio="1" buildNumber="100"
 | 
					                  iosBackgroundAudio="1" buildNumber="100" iosScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown"
 | 
				
			||||||
                  iosScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown"
 | 
					 | 
				
			||||||
                  iPadScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown"
 | 
					                  iPadScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown"
 | 
				
			||||||
                  UIStatusBarHidden="0" UIRequiresFullScreen="0" customPList="<plist version="1.0">
<dict>


<key>ITSAppUsesNonExemptEncryption</key>
	<false/>

<key>UIStatusBarHidden</key>
	<false/>
	<key>UIStatusBarStyle</key>
	<string>UIStatusBarStyleLightContent</string>

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>


<key>NSLocalNetworkUsageDescription</key>
	<string>DrumJamPad uses networking to communicate with other local services</string>

<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeIconFiles</key>
			<array/>
			<key>CFBundleTypeName</key>
			<string>Audio File</string>
			<key>CFBundleTypeRole</key>
			<string>Viewer</string>
			<key>LSHandlerRank</key>
			<string>Owner</string>
			<key>LSItemContentTypes</key>
			<array>
				<string>com.microsoft.waveform-audio</string>
				<string>public.aiff-audio</string>
				<string>com.apple.coreaudio-format</string>
				<string>public.mpeg-4-audio</string>
				<string>public.mp3</string>
			</array>
		</dict>
		</array>

</dict>
</plist>"
 | 
					                  UIStatusBarHidden="0" UIRequiresFullScreen="0" customPList="<plist version="1.0">
<dict>


<key>ITSAppUsesNonExemptEncryption</key>
	<false/>

<key>UIStatusBarHidden</key>
	<false/>
	<key>UIStatusBarStyle</key>
	<string>UIStatusBarStyleLightContent</string>

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>


<key>NSLocalNetworkUsageDescription</key>
	<string>DrumJamPad uses networking to communicate with other local services</string>

<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeIconFiles</key>
			<array/>
			<key>CFBundleTypeName</key>
			<string>Audio File</string>
			<key>CFBundleTypeRole</key>
			<string>Viewer</string>
			<key>LSHandlerRank</key>
			<string>Owner</string>
			<key>LSItemContentTypes</key>
			<array>
				<string>com.microsoft.waveform-audio</string>
				<string>public.aiff-audio</string>
				<string>com.apple.coreaudio-format</string>
				<string>public.mpeg-4-audio</string>
				<string>public.mp3</string>
			</array>
		</dict>
		</array>

</dict>
</plist>"
 | 
				
			||||||
                  UIFileSharingEnabled="1" UISupportsDocumentBrowser="1">
 | 
					                  UIFileSharingEnabled="1" UISupportsDocumentBrowser="1" extraDefs="PS_USE_VDSP_FFT=1">
 | 
				
			||||||
      <CONFIGURATIONS>
 | 
					      <CONFIGURATIONS>
 | 
				
			||||||
        <CONFIGURATION isDebug="1" name="Debug" headerPath="Source/PS_Source
Source/WDL
${HOME}/iosstatic/include"
 | 
					        <CONFIGURATION isDebug="1" name="Debug" headerPath="Source/PS_Source
Source/WDL
${HOME}/iosstatic/include"
 | 
				
			||||||
                       libraryPath="${HOME}/iosstatic/lib
"/>
 | 
					                       libraryPath="${HOME}/iosstatic/lib
"/>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user