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