/*********************************************
*           SeamlessBufferManagement.h
*
*            Variable speed playback
*                  ver. 1.00
*
**********************************************/

#ifndef _SBM_

#include "config.h"
#ifndef VC_PROJ
#define ALIGN64X __attribute__ ((aligned(16)))
#else
#define ALIGN64X
#endif
#define SBM_FIXED_HIFI
#define SBM_FIXED_HIFI_2
#define SBM_KALI_CHANGE

#ifndef VC_PROJ
#include <xtensa/tie/xt_hifi2.h>
#endif

/*defines*/
#define PROTECTION_LIMIT 23/*((1<<4)+(1<<2)+1)*/
#define PITCHCNTMAX 13
#define ABS(x) (((x)>0) ? (x):-(x))
#define ONE_Q16     (1<<16)
#define ONE_Q32     ((INT64)1<<32)
//#define DISABLETRANSITION
//#define QTR         9
#define QTR         10
#define TRMAXLEVEL  (1<<(10))
//#define TRMAXLEVEL  (1<<(9))
#define TRDECR      1
#define QPITCH 10
#define PITCHDIFFALPHA ((int)(0.98f*(1<<QPITCH)))
#define COMBFILTER_MINPERIOD 15

//#define DIST_THR_1 (SPEEDPIV_BUFLEN/4)
//#define DIST_THR_2 (SPEEDPIV_BUFLEN*3/8)
#define DIST_THR_1 (SPEEDPIV_BUFLEN*1/8)
#define DIST_THR_2 (SPEEDPIV_BUFLEN*2/8)
#define PGAIN_THR (10000) // (10000)
#define PITCH_DV_THR 100
#define QALPHAPITCH 10
#define ALPHAPITCHSTATE ((int)(0.9f*(1<<QALPHAPITCH)))

#ifdef KHW_RMS_COMPENSATE

#define SUBFRAMES_NUM 4
#define QGAINRMSCMPNS 14
#define QGAINRMSCMPNS_LONG 28
#define SBM_MAX_OUTPUT_NUM 888



#define MAX_GAIN_DIFF 800

#define MAXGAIN 19661 // ((int)(1.2f*(1<<QGAINRMSCMPNS)))
#define MINGAIN 13107 // ((int)(0.8f*(1<<QGAINRMSCMPNS)))
//#define MINGAIN 12288 // ((int)(0.75f*(1<<QGAINRMSCMPNS)))
#endif

//#define WIN1280
//#define WIN2048
//#define WIN864
//#define WIN510
//#define WIN512
//#define WIN1024
#define WIN864

#if defined WIN864
//#define SPEEDPIV_WINLEN_LOG (11)
#define SPEEDPIV_WINLEN (864)
#endif
#if defined WIN1280
//#define SPEEDPIV_WINLEN_LOG (11)
#define SPEEDPIV_WINLEN (1280)
#endif

#if defined WIN1536
//#define SPEEDPIV_WINLEN_LOG (11)
#define SPEEDPIV_WINLEN (1536)
#endif
#if defined WIN2048
#define SPEEDPIV_WINLEN_LOG (11)
#define SPEEDPIV_WINLEN (1<<SPEEDPIV_WINLEN_LOG)
#endif
#if defined WIN4096
#define SPEEDPIV_WINLEN_LOG (12)
#define SPEEDPIV_WINLEN (1<<SPEEDPIV_WINLEN_LOG)
#endif
#if defined WIN1024
#define SPEEDPIV_WINLEN_LOG (10)
#define SPEEDPIV_WINLEN (1<<SPEEDPIV_WINLEN_LOG)
#endif


#if defined WIN864
#define SPEEDPIV_WINLEN (864)
#endif

#if defined WIN512
#define SPEEDPIV_WINLEN (512)
#endif

#if defined WIN510
#define SPEEDPIV_WINLEN (510)
#endif

#if defined WIN432
#define SPEEDPIV_WINLEN (432)
#endif

#define SPEEDPIV_BUFLEN (SPEEDPIV_WINLEN)

/*typdefs and enum*/

enum {
	NO_TRANSITION = 0,
	NORMAL_TO_EFFECT,
	EFFECT_TO_NORMAL
};


typedef enum {
	SPEED_PROC_STATE_NORMAL,
	SPEED_PROC_STATE_WAIT_FOR_PITCH,
	SPEED_PROC_STATE_PROC_PITCH,
	SPEED_PROC_STATE_WAIT_FOR_CROSSFADE,
	SPEED_PROC_STATE_PROC_CROSSFADE
} Speed_Proc_State_T;

// int Pitch0, Pitchm1;
typedef struct {
	int Pitch;
	int Gain;
} FramePitchGain_T;
extern void SBM_SetPar(int speed);
extern void SBM_SetPitch(int p0, int g0, int pm1, int gm1);


extern int SBM_Exe(short *out, int n, int *DRC_tmp_buf[]);
extern int SBM_Exe_Frame(int *out1,int *out2, int n);
extern void SBM_Init(void);




#ifdef KHW_RMS_COMPENSATE
int SoundBooster_DRC_classic_rms_mono32(const int* in, int n);
#endif 

#ifdef KHW_HIFI_VECTOR_COPY
#define memcopy32(a,b,n) (__vec_memcpy(a,b,(n<<2)))
#endif

#endif // _SBM_

