![]() |
pl-nk v0.4.5
Plonk|Plink|Plank are a set of cross-platform C/C++ frameworks for audio software development
|
00001 /* 00002 ------------------------------------------------------------------------------- 00003 This file is part of the Plink, Plonk, Plank libraries 00004 by Martin Robinson 00005 00006 http://code.google.com/p/pl-nk/ 00007 00008 Copyright University of the West of England, Bristol 2011-14 00009 All rights reserved. 00010 00011 Redistribution and use in source and binary forms, with or without 00012 modification, are permitted provided that the following conditions are met: 00013 00014 * Redistributions of source code must retain the above copyright 00015 notice, this list of conditions and the following disclaimer. 00016 * Redistributions in binary form must reproduce the above copyright 00017 notice, this list of conditions and the following disclaimer in the 00018 documentation and/or other materials provided with the distribution. 00019 * Neither the name of University of the West of England, Bristol nor 00020 the names of its contributors may be used to endorse or promote products 00021 derived from this software without specific prior written permission. 00022 00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 00024 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00025 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00026 DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF THE WEST OF ENGLAND, BRISTOL BE 00027 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00028 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00029 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00030 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00032 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 00034 This software makes use of third party libraries. For more information see: 00035 doc/license.txt included in the distribution. 00036 ------------------------------------------------------------------------------- 00037 */ 00038 00039 #ifndef PLINK_BINARYOPPROCESS_H 00040 #define PLINK_BINARYOPPROCESS_H 00041 00042 #include "../plink_Process.h" 00043 00044 00052 #define PLINK_BINARYOPPROCESS_DEFINE_NNN(OPNAME, TYPECODE)\ 00053 void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNN (void* ppv, BinaryState* state) {\ 00054 PlinkProcess##TYPECODE* pp; PlankUL N; Plank##TYPECODE* output;\ 00055 const Plank##TYPECODE* left; const Plank##TYPECODE* right;\ 00056 (void)state;\ 00057 pp = (PlinkProcess##TYPECODE*)ppv;\ 00058 N = pp->buffers[0].bufferSize;\ 00059 output = pp->buffers[0].buffer;\ 00060 left = pp->buffers[1].buffer;\ 00061 right = pp->buffers[2].buffer;\ 00062 PLANK_VECTORBINARYOPVECTOR_NAME(OPNAME,TYPECODE) (output, left, right, N);\ 00063 } 00064 00065 #define PLINK_BINARYOPPROCESS_DEFINE_NN1(OPNAME, TYPECODE)\ 00066 void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NN1 (void* ppv, BinaryState* state) {\ 00067 PlinkProcess##TYPECODE* pp; PlankUL N; Plank##TYPECODE* output;\ 00068 const Plank##TYPECODE* left; Plank##TYPECODE right;\ 00069 (void)state;\ 00070 pp = (PlinkProcess##TYPECODE*)ppv;\ 00071 N = pp->buffers[0].bufferSize;\ 00072 output = pp->buffers[0].buffer;\ 00073 left = pp->buffers[1].buffer;\ 00074 right = pp->buffers[2].buffer[0];\ 00075 PLANK_VECTORBINARYOPSCALAR_NAME(OPNAME,TYPECODE) (output, left, right, N);\ 00076 } 00077 00078 #define PLINK_BINARYOPPROCESS_DEFINE_N1N(OPNAME, TYPECODE)\ 00079 void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N1N (void* ppv, BinaryState* state) {\ 00080 PlinkProcess##TYPECODE* pp; PlankUL N; Plank##TYPECODE* output;\ 00081 Plank##TYPECODE left; const Plank##TYPECODE* right;\ 00082 (void)state;\ 00083 pp = (PlinkProcess##TYPECODE*)ppv;\ 00084 N = pp->buffers[0].bufferSize;\ 00085 output = pp->buffers[0].buffer;\ 00086 left = pp->buffers[1].buffer[0];\ 00087 right = pp->buffers[2].buffer;\ 00088 PLANK_SCALARBINARYOPVECTOR_NAME(OPNAME,TYPECODE) (output, left, right, N);\ 00089 } 00090 00091 #define PLINK_BINARYOPPROCESS_DEFINE_N11(OPNAME, TYPECODE)\ 00092 void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N11 (void* ppv, BinaryState* state) {\ 00093 PlinkProcess##TYPECODE* pp; PlankUL N; Plank##TYPECODE* output;\ 00094 Plank##TYPECODE left, right, value;\ 00095 (void)state;\ 00096 pp = (PlinkProcess##TYPECODE*)ppv;\ 00097 N = pp->buffers[0].bufferSize;\ 00098 output = pp->buffers[0].buffer;\ 00099 left = pp->buffers[1].buffer[0];\ 00100 right = pp->buffers[2].buffer[0];\ 00101 value = pl_##OPNAME##TYPECODE (left, right);\ 00102 PLANK_VECTORFILL_NAME(TYPECODE) (output, value, N);\ 00103 } 00104 00105 #define PLINK_BINARYOPPROCESS_DEFINE_NNn(OPNAME, TYPECODE)\ 00106 void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNn (void* ppv, BinaryState* state) {\ 00107 PlinkProcess##TYPECODE* pp; PlankUL N, i; Plank##TYPECODE* output;\ 00108 const Plank##TYPECODE* left; const Plank##TYPECODE* right;\ 00109 double rightPos, rightInc;\ 00110 (void)state;\ 00111 pp = (PlinkProcess##TYPECODE*)ppv;\ 00112 N = pp->buffers[0].bufferSize;\ 00113 output = pp->buffers[0].buffer;\ 00114 left = pp->buffers[1].buffer;\ 00115 right = pp->buffers[2].buffer;\ 00116 rightPos = 0.0;\ 00117 rightInc = (double)pp->buffers[2].bufferSize / (double)N;\ 00118 for (i = 0; i < N; ++i) {\ 00119 output[i] = pl_##OPNAME##TYPECODE (left[i], right[(int)rightPos]);\ 00120 rightPos += rightInc;\ 00121 }\ 00122 } 00123 00124 #define PLINK_BINARYOPPROCESS_DEFINE_NnN(OPNAME, TYPECODE)\ 00125 void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NnN (void* ppv, BinaryState* state) {\ 00126 PlinkProcess##TYPECODE* pp; PlankUL N, i; Plank##TYPECODE* output;\ 00127 const Plank##TYPECODE* left; const Plank##TYPECODE* right;\ 00128 double leftPos, leftInc;\ 00129 (void)state;\ 00130 pp = (PlinkProcess##TYPECODE*)ppv;\ 00131 N = pp->buffers[0].bufferSize;\ 00132 output = pp->buffers[0].buffer;\ 00133 left = pp->buffers[1].buffer;\ 00134 right = pp->buffers[2].buffer;\ 00135 leftPos = 0.0;\ 00136 leftInc = (double)pp->buffers[1].bufferSize / (double)N;\ 00137 for (i = 0; i < N; ++i) {\ 00138 output[i] = pl_##OPNAME##TYPECODE (left[(int)leftPos], right[i]);\ 00139 leftPos += leftInc;\ 00140 }\ 00141 } 00142 00143 #define PLINK_BINARYOPPROCESS_DEFINE_Nnn(OPNAME, TYPECODE)\ 00144 void plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _Nnn (void* ppv, BinaryState* state) {\ 00145 PlinkProcess##TYPECODE* pp; PlankUL N, i; Plank##TYPECODE* output;\ 00146 const Plank##TYPECODE* left; const Plank##TYPECODE* right;\ 00147 double rightPos, rightInc, leftPos, leftInc;\ 00148 (void)state;\ 00149 pp = (PlinkProcess##TYPECODE*)ppv;\ 00150 N = pp->buffers[0].bufferSize;\ 00151 output = pp->buffers[0].buffer;\ 00152 left = pp->buffers[1].buffer;\ 00153 right = pp->buffers[2].buffer;\ 00154 leftPos = 0.0;\ 00155 leftInc = (double)pp->buffers[1].bufferSize / (double)N;\ 00156 rightPos = 0.0;\ 00157 rightInc = (double)pp->buffers[2].bufferSize / (double)N;\ 00158 for (i = 0; i < N; ++i) {\ 00159 output[i] = pl_##OPNAME##TYPECODE (left[(int)leftPos], right[(int)rightPos]);\ 00160 leftPos += leftInc;\ 00161 rightPos += rightInc;\ 00162 }\ 00163 } 00164 00165 #define PLINK_BINARYOPPROCESS_DEFINE_SELECT(OPNAME, TYPECODE)\ 00166 void plink_BinaryOpProcess ## OPNAME ## TYPECODE (void* ppv, BinaryState* state) {\ 00167 PlinkProcess##TYPECODE* pp; PlankUL N, n1, n2;\ 00168 (void)state;\ 00169 pp = (PlinkProcess##TYPECODE*)ppv;\ 00170 N = pp->buffers[0].bufferSize;\ 00171 n1 = pp->buffers[1].bufferSize;\ 00172 n2 = pp->buffers[2].bufferSize;\ 00173 \ 00174 if ((n1 == N) && (n2 == N))\ 00175 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNN (ppv, state);\ 00176 else if (n2 == N)\ 00177 if (n1 == 1)\ 00178 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N1N (ppv, state);\ 00179 else\ 00180 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NnN (ppv, state);\ 00181 else if (n1 == N)\ 00182 if (n2 == 1)\ 00183 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NN1 (ppv, state);\ 00184 else\ 00185 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNn (ppv, state);\ 00186 else if ((n1 == 1) && (n2 == 1))\ 00187 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N11 (ppv, state);\ 00188 else\ 00189 plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _Nnn (ppv, state);\ 00190 } 00191 00192 #define PLINK_BINARYOPPROCESS_DECLARE(OPNAME, TYPECODE)\ 00193 void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNN (void* pp, BinaryState* state);\ 00194 void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NN1 (void* pp, BinaryState* state);\ 00195 void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N1N (void* pp, BinaryState* state);\ 00196 void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _N11 (void* pp, BinaryState* state);\ 00197 void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NNn (void* pp, BinaryState* state);\ 00198 void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _NnN (void* pp, BinaryState* state);\ 00199 void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE ## _Nnn (void* pp, BinaryState* state);\ 00200 void PLINK_API plink_BinaryOpProcess ## OPNAME ## TYPECODE (void* pp, BinaryState* state); 00201 00202 00203 #define PLINK_BINARYOPPROCESS_DEFINE(OPNAME, TYPECODE)\ 00204 PLINK_BINARYOPPROCESS_DEFINE_NNN(OPNAME, TYPECODE)\ 00205 PLINK_BINARYOPPROCESS_DEFINE_NN1(OPNAME, TYPECODE)\ 00206 PLINK_BINARYOPPROCESS_DEFINE_N1N(OPNAME, TYPECODE)\ 00207 PLINK_BINARYOPPROCESS_DEFINE_N11(OPNAME, TYPECODE)\ 00208 PLINK_BINARYOPPROCESS_DEFINE_NNn(OPNAME, TYPECODE)\ 00209 PLINK_BINARYOPPROCESS_DEFINE_NnN(OPNAME, TYPECODE)\ 00210 PLINK_BINARYOPPROCESS_DEFINE_Nnn(OPNAME, TYPECODE)\ 00211 PLINK_BINARYOPPROCESS_DEFINE_SELECT(OPNAME, TYPECODE) 00212 00214 00215 00216 PLINK_BEGIN_C_LINKAGE 00217 00225 typedef PlinkState BinaryState; 00226 00227 PLINK_BINARYOPPROCESS_DECLARE(Add, F) 00228 PLINK_BINARYOPPROCESS_DECLARE(Sub, F) 00229 PLINK_BINARYOPPROCESS_DECLARE(Mul, F) 00230 PLINK_BINARYOPPROCESS_DECLARE(Div, F) 00231 PLINK_BINARYOPPROCESS_DECLARE(Mod, F) 00232 PLINK_BINARYOPPROCESS_DECLARE(Min, F) 00233 PLINK_BINARYOPPROCESS_DECLARE(Max, F) 00234 PLINK_BINARYOPPROCESS_DECLARE(Pow, F) 00235 PLINK_BINARYOPPROCESS_DECLARE(IsEqualTo, F) 00236 PLINK_BINARYOPPROCESS_DECLARE(IsNotEqualTo, F) 00237 PLINK_BINARYOPPROCESS_DECLARE(IsGreaterThan, F) 00238 PLINK_BINARYOPPROCESS_DECLARE(IsGreaterThanOrEqualTo, F) 00239 PLINK_BINARYOPPROCESS_DECLARE(IsLessThan, F) 00240 PLINK_BINARYOPPROCESS_DECLARE(IsLessThanOrEqualTo, F) 00241 PLINK_BINARYOPPROCESS_DECLARE(Hypot, F) 00242 PLINK_BINARYOPPROCESS_DECLARE(Atan2, F) 00243 PLINK_BINARYOPPROCESS_DECLARE(SumSqr, F) 00244 PLINK_BINARYOPPROCESS_DECLARE(DifSqr, F) 00245 PLINK_BINARYOPPROCESS_DECLARE(SqrSum, F) 00246 PLINK_BINARYOPPROCESS_DECLARE(SqrDif, F) 00247 PLINK_BINARYOPPROCESS_DECLARE(AbsDif, F) 00248 PLINK_BINARYOPPROCESS_DECLARE(Thresh, F) 00249 00251 00252 PLINK_END_C_LINKAGE 00253 00254 #endif // PLINK_BINARYOPPROCESS_H