 #ifndef INVWABOR_T_H
#define INVWABOR_T_H

#include "wabor_t_definitions.h"

static t_class *pcinvWabor_t;

struct _sinvWabor_t {
	t_object x_obj; //t_object has to be the first entry in the structure!!

	t_float fConstSignal;
	
	//Inlet fuer Gabor Structs Frames ist das Standardinlet
	t_inlet *x_inC; //Intlet fuer Kontrolldaten
	t_inlet *x_inf; //Inlet fuer Floats, setzt dMinValforCount
	t_outlet *x_outS; //Outlet fuer synthetisiertes Signal
	t_outlet *x_outM; //Outlet fuer Messages
	
	paf_type **paf; //Ich verstehe SSE noch nicht, deshalb ALIGN ich hier. Schaden tuts auf jeden Fall nix.
	t_float fMinValforCount; //Ab diesem Wert wird es als Sample gezaehl
	t_int iComputeSynthesis;
	struct _sSound{ //Array das die gesamte Audiodatei enthaelt.
	    sound_type ALIGN16 *paA[WABOR_T_MAX_THREADS]; //Pointer auf Ersten Eintrag des Vektors
	    sound_type *paC[WABOR_T_MAX_THREADS]; //Pointer auf Eintrag wo weiter gespeicher wird
	    sound_type *paE[WABOR_T_MAX_THREADS]; //Pointer auf eins hinter Ende
	    t_int iLength;
	} sSound;	
        t_int num_threads;
	
	struct _sthread_invwabor_param *painvwp[WABOR_T_MAX_THREADS];
        
    volatile t_int iThreadCount;
#if defined(WABOR_T_NOTHREADS)
    
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
    CRITICAL_SECTION mutex;
#elif defined (__linux__)
    pthread_mutex_t mutex;
    pthread_t thread_id;        
#else 
    
#endif     
	
};
typedef struct _sinvWabor_t sinvWabor_t;

struct _sthread_invwabor_param{
    t_int qMin, qSup;
    sound_type *sA,*sC, *sE;
    struct _sWabor_Coeff **patc;
    sinvWabor_t* psW;
    paf_type **paf_r, **paf_i;
    t_int Lm;
    t_int num_blocks;
} ;

void invwabor_t_setup(void);
void *invwabor_t_new(t_floatarg fArg);
void invwabor_t_set_pointers_to_NULL(sinvWabor_t* psW);

void invwabor_t_delete(sinvWabor_t* psW);
void invwabor_t_dsp(sinvWabor_t* psW, t_signal **sp);
t_int *invwabor_t_perform(t_int *aw);
thread_return_type invwabor_t_perform_thread(void *param);
void invwabor_t_bang(sinvWabor_t *psW);
t_int  invwabor_t_test_compileparam();
t_int  invwabor_t_test_param(sinvWabor_t* psW, t_int iPrintOutput);

void invwabor_t_initialize_sSound(sinvWabor_t* psW);
void invwabor_t_initialize_invwabor_param(sinvWabor_t* psW);

void invwabor_t_free_sSound(sinvWabor_t* psW);

void invwabor_t_set_soundbuffer_length_factor(sinvWabor_t* psW, t_float fFactor);
void invwabor_t_set_compute_synthesis(sinvWabor_t* psW, t_float fCompute);
void invwabor_t_set_num_threads(sinvWabor_t* psW, t_float num);
#endif //INVWABOR_T_H
