/*
 * F2F.c
 *
 *  Created on: 2021Äê11ÔÂ2ÈÕ
 *      Author: graydon
 */
#include <cstring>
#include "config.h"
#include "f2f.h"
#include "../drv/sport.h"

extern int SP0A_BUFFER[2][SLOTS*SAMPLE_NUM*2];//input 1-32
extern int SP0B_BUFFER[2][SLOTS*SAMPLE_NUM*2];//input 33-64
extern int SP1A_BUFFER[2][SLOTS*SAMPLE_NUM*2];//input 64-96
extern int SP1B_BUFFER[2][SLOTS*SAMPLE_NUM*2];//input 96-128
extern int SP2A_BUFFER[2][SLOTS*SAMPLE_NUM*2];
extern int SP2B_BUFFER[2][SLOTS*SAMPLE_NUM*2];
extern int SP3A_BUFFER[2][SLOTS*SAMPLE_NUM*2];
extern int SP3B_BUFFER[2][SLOTS*SAMPLE_NUM*2];


static s32* const g_InputBuffer[] = {
		SP0A_BUFFER[0] , SP0A_BUFFER[1],SP0B_BUFFER[0],SP0B_BUFFER[1],
		SP1A_BUFFER[0] , SP1A_BUFFER[1],SP1B_BUFFER[0],SP1B_BUFFER[1],

};
static s32* const g_OutputBuffer[] = {
		SP2A_BUFFER[0] , SP2A_BUFFER[1],SP2B_BUFFER[0],SP2B_BUFFER[1],
		SP3A_BUFFER[0] , SP3A_BUFFER[1],SP3B_BUFFER[0],SP3B_BUFFER[1],
};

ErrStatus F2F::SetRxChannelPtr(u32 channel ,ufloat* rxBuffer)
{
	if (channel >= MAX_INPUT_NUM) {
		return ErrStatus::ERR_PARAM;
    }
	mRxChannel[channel] = rxBuffer;
	return ErrStatus::SUCCESS;
}

ErrStatus F2F::SetTxChannelPtr(u32 channel, ufloat* txBuffer)
{
	if (channel >= MAX_OUTPUT_NUM) {
		return ErrStatus::ERR_PARAM;
	}
	mTxChannel[channel] = txBuffer;
	return ErrStatus::SUCCESS;
}

uvoid F2F::MuteOutput()
{
	u32 n = sizeof(g_OutputBuffer)/sizeof(s32*);

	for(u32 i =0 ;i< n;i++) {
		memset(g_OutputBuffer[i],0 , SLOTS*SAMPLE_NUM*2*sizeof(s32));
	}
}

#define CHANNEL_OF(c) (2*((c)&(SLOTS-1))+ (c)/SLOTS)

uvoid F2F::UpdateInput(u32 blockIndex)
{
	for(u32 i =0 ;i < mInputNum ;i++) {
		u32 block = i/(2*SLOTS);
		s32* dataPtr = g_InputBuffer[2*block+blockIndex] ;

		floatData(mRxChannel[i],dataPtr + CHANNEL_OF(i&(2*SLOTS-1)), SLOTS*2, SAMPLE_NUM);
	}
}

uvoid F2F::UpdateOutput(u32 blockIndex)
{
	for(u32 i =0 ;i < mOutputNum ;i++) {
		u32 block = i/(2*SLOTS);
		s32* dataPtr = g_OutputBuffer[2*block+blockIndex];

		fixData(dataPtr+ CHANNEL_OF(i&(2*SLOTS-1)) ,mTxChannel[i],SLOTS*2, SAMPLE_NUM);
	}
}