00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef _VRSUM_H_
00038 #define _VRSUM_H_
00039
00040 #include <VrSigProc.h>
00041 #if defined (ENABLE_MMX)
00042 #include <VrMMX.h>
00043 #endif
00044
00045 template<class iType,class oType>
00046 class VrSum : public VrSigProc {
00047 protected:
00048 #if defined (ENABLE_MMX)
00049 char mmxReady;
00050 #endif
00051 public:
00052 virtual const char *name() { return "VrSum"; }
00053 virtual int work(VrSampleRange output, void *o[],
00054 VrSampleRange inputs[], void *i[]);
00055 virtual void initialize() {
00056 #if 0
00057
00058 setHistory(8);
00059 setOutputSize(8);
00060 #endif
00061 };
00062 VrSum();
00063 };
00064
00065 template<class iType,class oType> int
00066 VrSum<iType,oType>::work(VrSampleRange output, void *ao[],
00067 VrSampleRange inputs[], void *ai[])
00068 {
00069 iType **i = (iType **)ai;
00070 oType **o = (oType **)ao;
00071 int size = output.size;
00072 int ni = getNumberInputs();
00073 oType temp;
00074
00075 while(size-- > 0) {
00076 #if 0
00077 int units = availableUnits();
00078 if(availableSpace() < units ) units = availableSpace();
00079 if (n < units) units = n;
00080
00081 #ifdef XENABLE_MMX
00082 if(mmxReady && getNumberInputs()>1) {
00083 units=units-units%8;
00084 if (PARANOID && units <= 0){
00085 fprintf(stderr, "Can't write any data in VrSum\n");
00086 abort ();
00087 }
00088
00089 mmxAdd(inputHistoryPtrN(0), inputHistoryPtrN(1),
00090 units, outputWritePtr());
00091 incReadPtrN(0,units);
00092 incReadPtrN(1,units);
00093 int jj=2;
00094 while(jj < getNumberInputs()){
00095 mmxAdd(outputWritePtr(), inputHistoryPtrN(jj),
00096 units, outputWritePtr());
00097 incReadPtrN(jj,units);
00098 jj++;
00099 }
00100
00101 } else
00102 #endif
00103 #endif
00104 {
00105 temp = *i[0]++;
00106 int j=1;
00107 while(j < ni)
00108 temp += *i[j++]++;
00109 *o[0]++ = temp;
00110 }
00111 }
00112 return output.size;
00113 }
00114
00115 template<class iType,class oType>
00116 VrSum<iType,oType>::VrSum()
00117 : VrSigProc(1, sizeof(iType), sizeof(oType))
00118 {
00119 #ifdef ENABLE_MMX
00120 mmxReady=queryMMX();
00121 #endif
00122 }
00123 #endif