#ifndef _I2S_FREERTOS_H_
#define _I2S_FREERTOS_H_

#include "i2s_api.h"
#include "user/playerconfig.h"

#define I2S_DMA_PAGE_WAIT_MS_MIN 	4 // 8 // min 2 ms (CPU CLK 166), min 4 ms (CPU CLK 83),
#define I2S_DMA_PAGE_SIZE_MS_96K	(96000/1000) // in sizeof(u32)
#define I2S_DMA_PAGE_NUM    		4   // Valid number is 2~4

#define I2S0_SCLK_PIN            PE_1 // PD_1
#define I2S0_WS_PIN              PE_0 // PD_0
#define I2S0_SD_PIN              PE_2 // PD_2

#define I2S1_SCLK_PIN            PC_1
#define I2S1_WS_PIN              PC_0
#define I2S1_SD_PIN              PC_2

#define I2S_DEBUG_LEVEL 0

typedef struct _I2S_OBJS_ {
	i2s_t i2s_obj;
	u32 *currDMABuff;	// Current DMA buffer we're writing to
	u32 currDMABuffPos;	// Current position in that DMA buffer
	s32 sampl_err;
#if I2S_DEBUG_LEVEL > 1
	u32 underrunCnt;	// DMA underrun counter
#endif
}I2S_OBJS, *PI2S_OBJS;

#define MAX_I2S_OBJS 2
#define I2S0_OBJSN 0
#define I2S1_OBJSN 1

//extern PI2S_OBJS pi2s[MAX_I2S_OBJS]; // I2S0, I2S1

int i2sInit(int mask, int bufsize, int word_len); // word_len = WL_16b or WL_24b
void i2sClose(int mask);
char i2sSetRate(int mask, int rate);
u32 i2sPushPWMSamples(u32 sample);

#if I2S_DEBUG_LEVEL > 1
long i2sGetUnderrunCnt(int num);
#endif

#endif
