#include "../include/kit_sdl2/kit_kmixer.h" #include "../_private/include/_kit_privmacro.h" #include "../_private/include/_kit_kmixerPrivate.h" /* VoiceProcess: convert data type to float convert mono to stereo, or vice versa */ //include intrinsic functions #include //bitmasks for _kit_kmixerGlobals.capabilities #define _SSE_MASK (1<<5) #define _SSE2_MASK (1<<4) #define _SSE3_MASK (1<<3) #define _SSE41_MASK (1<<2) #define _AVX_MASK (1<<1) #define _AVX2_MASK (1<<0) //for visual clarity during ProcChannels //(this could also just be an enum probably, but w/e) #define _M_to_M (0) // mono->mono #define _M_to_S (1) // mono->stereo #define _S_to_M (2) //stereo->mono #define _S_to_S (3) //stereo->stereo //used to multiply an int by the inverse of an int to get a normalized float //(input 8-bit samples will be unsigned, so -=0x80 to convert them to signed first) const float invi8 =1.0f/0x7f; const float invi16=1.0f/0x7fff; const float invi32=1.0f/0x7fffffff; //stores left and right ear components of a stereo stream struct _stereo_u8 { Uint8 l,r; }; struct _stereo_i16 { Sint16 l,r; }; struct _stereo_i32 { Sint32 l,r; }; struct _stereo_f32 { float l,r; }; static inline void _kit_kmixerVoiceProcType(void* dataIn, void* dataOut, Uint32 numSamples, SDL_AudioFormat type, int channelInfo) { } //assumes f32 void _kit_kmixerVoiceProcChannels(void* dataIn, void* dataOut, Uint32 sampleFrames, int channelInfo){ Uint32 sizeIn,sizeOut; sizeIn=sizeOut=sampleFrames*sizeof(float); __m128 sse0,sse1,sse2; //__m256 avx0,avx1; float *dataInM=dataIn, *dataOutM=dataOut; struct _stereo_f32 *dataOutS=dataOut; if(_kit_kmixerGlobals.capabilities&_AVX_MASK){ switch(channelInfo){ //has >=AVX1 //TBD case _M_to_M: case _M_to_S: sizeOut<<=1; case _S_to_M: sizeIn<<=1; case _S_to_S: sizeIn=sizeOut<<=1; }} else if(_kit_kmixerGlobals.capabilities&_SSE3_MASK && channelInfo==_S_to_M){ //(requires SSE3's "hadd") //TBD } else if(_kit_kmixerGlobals.capabilities&_SSE_MASK){ switch(channelInfo){ //has >=SSE1 case _M_to_S: sizeOut<<=1; for(Uint32 i=0,o=-16; i