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 #include "assert.h"
00033 #include "uti.h"
00034 #include "spl.h"
00035 #include "samp.hpp"
00036
00037
00038
00039 UINT Samp::getCh( INT16& sample, UINT ch )
00040 {
00041 UINT ret=0;
00042 if (ch>=nchan) {
00043 LONG l=0;
00044 for (UINT i=0; i<nchan; i++) { ret=getNoCh(sample); l+=sample; }
00045 sample = (l+(nchan/2)/nchan);
00046 return ret;
00047 }
00048 else {
00049 if (ch>0) setPosNoCh(getPosNoCh()+ch);
00050 ret=getNoCh(sample);
00051 if (ch+1<nchan) setPosNoCh(getPosNoCh()+(nchan-ch-1));
00052 return ret;
00053 }
00054 }
00055
00056
00057
00058 UINT Samp::setCh( INT16 sample, UINT ch )
00059 {
00060 UINT ret=0;
00061 if (ch>=nchan) {
00062 for (UINT i=0; i<nchan; i++) ret=setNoCh(sample);
00063 return ret;
00064 }
00065 else {
00066 if (getNNoCh()<=getPosNoCh()) return insCh(sample,ch);
00067
00068 if (ch>0) setPosNoCh(getPosNoCh()+ch);
00069 ret=setNoCh(sample);
00070 if (ch+1<nchan) setPosNoCh(getPosNoCh()+(nchan-ch-1));
00071 return ret;
00072 }
00073 }
00074
00075
00076
00077 UINT Samp::insCh( INT16 sample, UINT ch )
00078 {
00079 UINT ret=0;
00080 UINT i;
00081 if (ch>=nchan) {
00082 for (i=0; i<nchan; i++) ret=insNoCh(sample);
00083 return ret;
00084 }
00085 else {
00086 for (i=0; i<ch; i++) insNoCh((INT16)0);
00087 ret=insNoCh(sample);
00088 for (i=ch+1; i<nchan; i++) insNoCh((INT16)0);
00089 return ret;
00090 }
00091 }
00092
00093
00094
00095 UINT Samp::getCh( DOUBLE& sample, UINT ch )
00096 {
00097 UINT ret=0;
00098 if (ch>=nchan) {
00099 DOUBLE l=0;
00100 for (UINT i=0; i<nchan; i++) { ret=getNoCh(sample); l+=sample; }
00101 sample = l/nchan;
00102 return ret;
00103 }
00104 else {
00105 if (ch>0) setPosNoCh(getPosNoCh()+ch);
00106 ret=getNoCh(sample);
00107 if (ch+1<nchan) setPosNoCh(getPosNoCh()+(nchan-ch-1));
00108 return ret;
00109 }
00110 }
00111
00112
00113
00114 UINT Samp::setCh( DOUBLE sample, UINT ch )
00115 {
00116 UINT ret=0;
00117 if (ch>=nchan) {
00118 for (UINT i=0; i<nchan; i++) ret=setNoCh(sample);
00119 return ret;
00120 }
00121 else {
00122 if (ch>0) setPosNoCh(getPosNoCh()+ch);
00123 ret=setNoCh(sample);
00124 if (ch+1<nchan) setPosNoCh(getPosNoCh()+(nchan-ch-1));
00125 return ret;
00126 }
00127 }
00128
00129
00130
00131 UINT Samp::insCh( DOUBLE sample, UINT ch )
00132 {
00133 UINT ret=0;
00134 UINT i;
00135 if (ch>=nchan) {
00136 for (i=0; i<nchan; i++) ret=insNoCh(sample);
00137 return ret;
00138 }
00139 else {
00140 for (i=0; i<ch; i++) insNoCh((DOUBLE)0);
00141 ret=insNoCh(sample);
00142 for (i=ch+1; i<nchan; i++) insNoCh((DOUBLE)0);
00143 return ret;
00144 }
00145 }
00146
00147
00148
00149 UINT Samp::getBlkCh( INT16* block, UINT len, UINT ch )
00150 {
00151 if (nchan==1) return getBlkNoCh(block,len);
00152
00153 UINT n = 0;
00154 while (len--) n+=getCh(*(block++),ch);
00155 return n;
00156 }
00157
00158
00159
00160 UINT Samp::setBlkCh( const INT16* block, UINT len, UINT ch )
00161 {
00162 if (nchan==1) return setBlkNoCh(block,len);
00163
00164 UINT n = 0;
00165 if (!block) while (len--) n+=setCh((INT16)0,ch);
00166 else while (len--) n+=setCh(*(block++),ch);
00167 return n;
00168 }
00169
00170
00171
00172 UINT Samp::insBlkCh( const INT16* block, UINT len, UINT ch )
00173 {
00174 if (nchan==1) return insBlkNoCh(block,len);
00175
00176 UINT n = 0;
00177 if (!block) while (len--) n+=insCh((INT16)0,ch);
00178 else while (len--) n+=insCh(*(block++),ch);
00179 return n;
00180 }
00181
00182
00183
00184 UINT Samp::getBlkCh( DOUBLE* block, UINT len, UINT ch )
00185 {
00186 if (nchan==1) return getBlkNoCh(block,len);
00187
00188 UINT n = 0;
00189 while (len--) n+=getCh(*(block++),ch);
00190 return n;
00191 }
00192
00193
00194
00195 UINT Samp::setBlkCh( const DOUBLE* block, UINT len, UINT ch )
00196 {
00197 if (nchan==1) return setBlkNoCh(block,len);
00198
00199 UINT n = 0;
00200 if (!block) while (len--) n+=setCh((DOUBLE)0,ch);
00201 else while (len--) n+=setCh(*(block++),ch);
00202 return n;
00203 }
00204
00205
00206
00207 UINT Samp::insBlkCh( const DOUBLE* block, UINT len, UINT ch )
00208 {
00209 if (nchan==1) return insBlkNoCh(block,len);
00210
00211 UINT n = 0;
00212 if (!block) while (len--) n+=insCh((DOUBLE)0,ch);
00213 else while (len--) n+=insCh(*(block++),ch);
00214 return n;
00215 }
00216
00217
00218
00219 UINT Samp::getChRange( INT16* sampr, UINT ch1, UINT ch2 )
00220 {
00221 UINT ret=0;
00222 assert(ch1<=ch2);
00223 while ((ch2>=nchan)&&(ch2>=ch1)) { sampr[ch2-ch1]=0; ch2--; }
00224 if (ch1>=nchan) return ret;
00225
00226 if (ch1>0) setPosNoCh(getPosNoCh()+ch1);
00227 ret=getBlkNoCh(sampr,ch2-ch1+1);
00228 if (ch2+1<nchan) setPosNoCh(getPosNoCh()+(nchan-ch2-1));
00229 return ret;
00230 }
00231
00232
00233
00234 UINT Samp::setChRange( const INT16* sampr, UINT ch1, UINT ch2 )
00235 {
00236 UINT ret=0;
00237 if (getNNoCh()<=getPosNoCh()) return insChRange(sampr,ch1,ch2);
00238
00239 assert(ch1<=ch2);
00240 if (ch2>=nchan) ch2=nchan-1;
00241 if (ch1>=nchan) return ret;
00242
00243 if (ch1>0) setPosNoCh(getPosNoCh()+ch1);
00244 ret=setBlkNoCh(sampr,ch2-ch1+1);
00245 if (ch2+1<nchan) setPosNoCh(getPosNoCh()+(nchan-ch2-1));
00246 return ret;
00247 }
00248
00249
00250
00251 UINT Samp::insChRange( const INT16* sampr, UINT ch1, UINT ch2 )
00252 {
00253 UINT ret, i;
00254 assert(ch1<=ch2);
00255 if (ch2>=nchan) ch2=nchan-1;
00256 if (ch1>=nchan) ch1=nchan;
00257
00258 for (i=0; i<ch1; i++) insNoCh((INT16)0);
00259 if (ch1>=nchan) return 0;
00260 ret=setBlkNoCh(sampr,ch2-ch1+1);
00261 for (i=ch2+1; i<nchan; i++) insNoCh((INT16)0);
00262 return ret;
00263 }
00264
00265
00266
00267 UINT Samp::getChRange( DOUBLE* sampr, UINT ch1, UINT ch2 )
00268 {
00269 UINT ret;
00270 assert(ch1<=ch2);
00271 while ((ch2>=nchan)&&(ch2>=ch1)) { sampr[ch2-ch1]=0; ch2--; }
00272 if (ch1>=nchan) return 0;
00273
00274 if (ch1>0) setPosNoCh(getPosNoCh()+ch1);
00275 ret=getBlkNoCh(sampr,ch2-ch1+1);
00276 if (ch2+1<nchan) setPosNoCh(getPosNoCh()+(nchan-ch2-1));
00277 return ret;
00278 }
00279
00280
00281
00282 UINT Samp::setChRange( const DOUBLE* sampr, UINT ch1, UINT ch2 )
00283 {
00284 UINT ret;
00285 if (getNNoCh()<=getPosNoCh()) return insChRange(sampr,ch1,ch2);
00286
00287 assert(ch1<=ch2);
00288 if (ch2>=nchan) ch2=nchan-1;
00289 if (ch1>=nchan) return 0;
00290
00291 if (ch1>0) setPosNoCh(getPosNoCh()+ch1);
00292 ret=setBlkNoCh(sampr,ch2-ch1+1);
00293 if (ch2+1<nchan) setPosNoCh(getPosNoCh()+(nchan-ch2-1));
00294 return ret;
00295 }
00296
00297
00298
00299 UINT Samp::insChRange( const DOUBLE* sampr, UINT ch1, UINT ch2 )
00300 {
00301 UINT ret, i;
00302 assert(ch1<=ch2);
00303 if (ch2>=nchan) ch2=nchan-1;
00304 if (ch1>=nchan) ch1=nchan;
00305
00306 for (i=0; i<ch1; i++) insNoCh((DOUBLE)0);
00307 if (ch1>=nchan) return 0;
00308 ret=setBlkNoCh(sampr,ch2-ch1+1);
00309 for (i=ch2+1; i<nchan; i++) insNoCh((DOUBLE)0);
00310 return ret;
00311 }
00312
00313
00314
00315 UINT Samp::getBlkChRange( INT16* block, UINT len, UINT ch1, UINT ch2 )
00316 {
00317 UINT n = 0;
00318 while (len--) {
00319 n+=getChRange(block,ch1,ch2);
00320 block+= (ch2-ch1+1);
00321 }
00322 return n;
00323 }
00324
00325
00326
00327 UINT Samp::setBlkChRange( const INT16* block, UINT len, UINT ch1, UINT ch2 )
00328 {
00329 UINT n = 0;
00330 while (len--) {
00331 n+=setChRange(block,ch1,ch2);
00332 if (block) block+=(ch2-ch1+1);
00333 }
00334 return n;
00335 }
00336
00337
00338
00339 UINT Samp::insBlkChRange( const INT16* block, UINT len, UINT ch1, UINT ch2 )
00340 {
00341 UINT n = 0;
00342 while (len--) {
00343 n+=insChRange(block,ch1,ch2);
00344 if (block) block+=(ch2-ch1+1);
00345 }
00346 return n;
00347 }
00348
00349
00350
00351 UINT Samp::getBlkChRange( DOUBLE* block, UINT len, UINT ch1, UINT ch2 )
00352 {
00353 UINT n = 0;
00354 while (len--) {
00355 n+=getChRange(block,ch1,ch2);
00356 block+=(ch2-ch1+1);
00357 }
00358 return n;
00359 }
00360
00361
00362
00363 UINT Samp::setBlkChRange( const DOUBLE* block, UINT len, UINT ch1, UINT ch2 )
00364 {
00365 UINT n = 0;
00366 while (len--) {
00367 n+=setChRange(block,ch1,ch2);
00368 if (block) block+=(ch2-ch1+1);
00369 }
00370 return n;
00371 }
00372
00373
00374
00375 UINT Samp::insBlkChRange( const DOUBLE* block, UINT len, UINT ch1, UINT ch2 )
00376 {
00377 UINT n = 0;
00378 while (len--) {
00379 n+=insChRange(block,ch1,ch2);
00380 if (block) block+=(ch2-ch1+1);
00381 }
00382 return n;
00383 }
00384
00385
00386