spike.c 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <structures.h>
  4. #include <tkglobals.h>
  5. #include <pnames.h>
  6. #include <filetype.h>
  7. #include <processno.h>
  8. #include <modeno.h>
  9. #include <logic.h>
  10. #include <globcon.h>
  11. #include <cdpmain.h>
  12. #include <math.h>
  13. #include <mixxcon.h>
  14. #include <osbind.h>
  15. #include <standalone.h>
  16. #include <ctype.h>
  17. #include <sfsys.h>
  18. #include <string.h>
  19. #include <srates.h>
  20. #ifdef unix
  21. #define round(x) lround((x))
  22. #endif
  23. char errstr[2400];
  24. int anal_infiles = 1;
  25. int sloom = 0;
  26. int sloombatch = 0;
  27. const char* cdp_version = "6.1.0";
  28. //CDP LIB REPLACEMENTS
  29. static int check_gate_param_validity_and_consistency(dataptr dz);
  30. static int setup_spike_application(dataptr dz);
  31. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  32. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  33. static int setup_spike_param_ranges_and_defaults(dataptr dz);
  34. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  35. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  36. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  37. static int establish_application(dataptr dz);
  38. static int initialise_vflags(dataptr dz);
  39. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  40. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  41. static int mark_parameter_types(dataptr dz,aplptr ap);
  42. static int assign_file_data_storage(int infilecnt,dataptr dz);
  43. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  44. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  45. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  46. static int handle_the_special_data(int *cmdlinecnt,char ***cmdline,dataptr dz);
  47. static int spike(dataptr dz);
  48. static void TrimPeakData(dataptr dz);
  49. /**************************************** MAIN *********************************************/
  50. int main(int argc,char *argv[])
  51. {
  52. int exit_status;
  53. dataptr dz = NULL;
  54. char **cmdline;
  55. int cmdlinecnt;
  56. int n;
  57. aplptr ap;
  58. int is_launched = FALSE;
  59. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  60. fprintf(stdout,"%s\n",cdp_version);
  61. fflush(stdout);
  62. return 0;
  63. }
  64. /* CHECK FOR SOUNDLOOM */
  65. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  66. sloom = 0;
  67. sloombatch = 1;
  68. }
  69. if(sflinit("cdp")){
  70. sfperror("cdp: initialisation\n");
  71. return(FAILED);
  72. }
  73. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  74. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  75. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  76. return(FAILED);
  77. }
  78. if(!sloom) {
  79. if(argc == 1) {
  80. usage1();
  81. return(FAILED);
  82. } else if(argc == 2) {
  83. usage2(argv[1]);
  84. return(FAILED);
  85. }
  86. }
  87. if(!sloom) {
  88. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  89. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  90. return(FAILED);
  91. }
  92. cmdline = argv;
  93. cmdlinecnt = argc;
  94. if((get_the_process_no(argv[0],dz))<0)
  95. return(FAILED);
  96. cmdline++;
  97. cmdlinecnt--;
  98. dz->maxmode = 0;
  99. // setup_particular_application =
  100. if((exit_status = setup_spike_application(dz))<0) {
  101. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  102. return(FAILED);
  103. }
  104. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  105. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  106. return(FAILED);
  107. }
  108. } else {
  109. //parse_TK_data() =
  110. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  111. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  112. return(exit_status);
  113. }
  114. }
  115. ap = dz->application;
  116. // parse_infile_and_hone_type() =
  117. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  118. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  119. return(FAILED);
  120. }
  121. // setup_param_ranges_and_defaults() =
  122. if((exit_status = setup_spike_param_ranges_and_defaults(dz))<0) {
  123. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  124. return(FAILED);
  125. }
  126. // open_first_infile CDP LIB
  127. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  128. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  129. return(FAILED);
  130. }
  131. cmdlinecnt--;
  132. cmdline++;
  133. // handle_extra_infiles() : redundant
  134. // handle_outfile() =
  135. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  136. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  137. return(FAILED);
  138. }
  139. // handle_formants() redundant
  140. // handle_formant_quiksearch() redundant
  141. // handle_special_data ...
  142. if((exit_status = handle_the_special_data(&cmdlinecnt,&cmdline,dz))<0) { // CDP LIB
  143. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  144. return(FAILED);
  145. }
  146. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  147. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  148. return(FAILED);
  149. }
  150. is_launched = TRUE;
  151. dz->bufcnt = 2;
  152. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  153. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  154. return(MEMORY_ERROR);
  155. }
  156. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  157. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  158. return(MEMORY_ERROR);
  159. }
  160. for(n = 0;n <dz->bufcnt; n++)
  161. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  162. dz->sampbuf[n] = (float *)0;
  163. if(dz->param[2] > 0.0 || dz->param[3] > 0.0)
  164. TrimPeakData(dz);
  165. if((exit_status = create_sndbufs(dz))<0) { // CDP LIB
  166. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  167. return(FAILED);
  168. }
  169. //param_preprocess() redundant
  170. //spec_process_file =
  171. if((exit_status = spike(dz))<0) {
  172. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  173. return(FAILED);
  174. }
  175. if((exit_status = complete_output(dz))<0) { // CDP LIB
  176. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  177. return(FAILED);
  178. }
  179. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  180. free(dz);
  181. return(SUCCEEDED);
  182. }
  183. /**********************************************
  184. REPLACED CDP LIB FUNCTIONS
  185. **********************************************/
  186. /****************************** SET_PARAM_DATA *********************************/
  187. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  188. {
  189. ap->special_data = (char)special_data;
  190. ap->param_cnt = (char)paramcnt;
  191. ap->max_param_cnt = (char)maxparamcnt;
  192. if(ap->max_param_cnt>0) {
  193. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  194. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  195. return(MEMORY_ERROR);
  196. }
  197. strcpy(ap->param_list,paramlist);
  198. }
  199. return(FINISHED);
  200. }
  201. /****************************** SET_VFLGS *********************************/
  202. int set_vflgs
  203. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  204. {
  205. ap->option_cnt = (char) optcnt; /*RWD added cast */
  206. if(optcnt) {
  207. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  208. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  209. return(MEMORY_ERROR);
  210. }
  211. strcpy(ap->option_list,optlist);
  212. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  213. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  214. return(MEMORY_ERROR);
  215. }
  216. strcpy(ap->option_flags,optflags);
  217. }
  218. ap->vflag_cnt = (char) vflagcnt;
  219. ap->variant_param_cnt = (char) vparamcnt;
  220. if(vflagcnt) {
  221. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  222. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  223. return(MEMORY_ERROR);
  224. }
  225. strcpy(ap->variant_list,varlist);
  226. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  227. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  228. return(MEMORY_ERROR);
  229. }
  230. strcpy(ap->variant_flags,varflags);
  231. }
  232. return(FINISHED);
  233. }
  234. /***************************** APPLICATION_INIT **************************/
  235. int application_init(dataptr dz)
  236. {
  237. int exit_status;
  238. int storage_cnt;
  239. int tipc, brkcnt;
  240. aplptr ap = dz->application;
  241. if(ap->vflag_cnt>0)
  242. initialise_vflags(dz);
  243. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  244. ap->total_input_param_cnt = (char)tipc;
  245. if(tipc>0) {
  246. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  247. return(exit_status);
  248. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  249. return(exit_status);
  250. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  251. return(exit_status);
  252. }
  253. brkcnt = tipc;
  254. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  255. if(brkcnt>0) {
  256. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  257. return(exit_status);
  258. }
  259. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  260. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  261. return(exit_status);
  262. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  263. return(exit_status);
  264. }
  265. if((exit_status = mark_parameter_types(dz,ap))<0)
  266. return(exit_status);
  267. // establish_infile_constants() replaced by
  268. dz->infilecnt = 1;
  269. //establish_bufptrs_and_extra_buffers():
  270. return(FINISHED);
  271. }
  272. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  273. /* RWD mallo changed to calloc; helps debug verison run as release! */
  274. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  275. {
  276. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  277. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  278. return(MEMORY_ERROR);
  279. }
  280. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  281. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  282. return(MEMORY_ERROR);
  283. }
  284. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  285. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  286. return(MEMORY_ERROR);
  287. }
  288. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  289. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  290. return(MEMORY_ERROR);
  291. }
  292. return(FINISHED);
  293. }
  294. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  295. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  296. {
  297. int n;
  298. for(n=0;n<storage_cnt;n++) {
  299. dz->is_int[n] = (char)0;
  300. dz->no_brk[n] = (char)0;
  301. }
  302. return(FINISHED);
  303. }
  304. /***************************** MARK_PARAMETER_TYPES **************************/
  305. int mark_parameter_types(dataptr dz,aplptr ap)
  306. {
  307. int n, m; /* PARAMS */
  308. for(n=0;n<ap->max_param_cnt;n++) {
  309. switch(ap->param_list[n]) {
  310. case('0'): break; /* dz->is_active[n] = 0 is default */
  311. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  312. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  313. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  314. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  315. default:
  316. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  317. return(PROGRAM_ERROR);
  318. }
  319. } /* OPTIONS */
  320. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  321. switch(ap->option_list[n]) {
  322. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  323. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  324. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  325. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  326. default:
  327. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  328. return(PROGRAM_ERROR);
  329. }
  330. } /* VARIANTS */
  331. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  332. switch(ap->variant_list[n]) {
  333. case('0'): break;
  334. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  335. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  336. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  337. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  338. default:
  339. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  340. return(PROGRAM_ERROR);
  341. }
  342. } /* INTERNAL */
  343. for(n=0,
  344. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  345. switch(ap->internal_param_list[n]) {
  346. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  347. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  348. case('d'): dz->no_brk[m] = (char)1; break;
  349. default:
  350. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  351. return(PROGRAM_ERROR);
  352. }
  353. }
  354. return(FINISHED);
  355. }
  356. /************************ HANDLE_THE_OUTFILE *********************/
  357. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  358. {
  359. int exit_status;
  360. char *filename = (*cmdline)[0];
  361. if(filename[0]=='-' && filename[1]=='f') {
  362. dz->floatsam_output = 1;
  363. dz->true_outfile_stype = SAMP_FLOAT;
  364. filename+= 2;
  365. }
  366. if(!sloom) {
  367. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  368. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  369. return(DATA_ERROR);
  370. }
  371. }
  372. strcpy(dz->outfilename,filename);
  373. if((exit_status = create_sized_outfile(filename,dz))<0)
  374. return(exit_status);
  375. (*cmdline)++;
  376. (*cmdlinecnt)--;
  377. return(FINISHED);
  378. }
  379. /***************************** ESTABLISH_APPLICATION **************************/
  380. int establish_application(dataptr dz)
  381. {
  382. aplptr ap;
  383. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  384. sprintf(errstr,"establish_application()\n");
  385. return(MEMORY_ERROR);
  386. }
  387. ap = dz->application;
  388. memset((char *)ap,0,sizeof(struct applic));
  389. return(FINISHED);
  390. }
  391. /************************* INITIALISE_VFLAGS *************************/
  392. int initialise_vflags(dataptr dz)
  393. {
  394. int n;
  395. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  396. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  397. return(MEMORY_ERROR);
  398. }
  399. for(n=0;n<dz->application->vflag_cnt;n++)
  400. dz->vflag[n] = FALSE;
  401. return FINISHED;
  402. }
  403. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  404. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  405. {
  406. int n;
  407. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  408. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  409. return(MEMORY_ERROR);
  410. }
  411. for(n=0;n<tipc;n++)
  412. ap->default_val[n] = 0.0;
  413. return(FINISHED);
  414. }
  415. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  416. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  417. {
  418. int n;
  419. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  420. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  421. return(MEMORY_ERROR);
  422. }
  423. for(n=0;n<tipc;n++)
  424. dz->is_active[n] = (char)0;
  425. return(FINISHED);
  426. }
  427. /************************* SETUP_SPIKE_APPLICATION *******************/
  428. int setup_spike_application(dataptr dz)
  429. {
  430. int exit_status;
  431. aplptr ap;
  432. if((exit_status = establish_application(dz))<0) // GLOBAL
  433. return(FAILED);
  434. ap = dz->application;
  435. // SEE parstruct FOR EXPLANATION of next 2 functions
  436. if((exit_status = set_param_data(ap,SPIKEDATA ,2,2,"DD"))<0)
  437. return(FAILED);
  438. if((exit_status = set_vflgs(ap,"ud",2,"dd","n",1,0,"0"))<0)
  439. return(FAILED);
  440. // set_legal_infile_structure -->
  441. dz->has_otherfile = FALSE;
  442. // assign_process_logic -->
  443. dz->input_data_type = SNDFILES_ONLY;
  444. dz->process_type = EQUAL_SNDFILE;
  445. dz->outfiletype = SNDFILE_OUT;
  446. return application_init(dz); //GLOBAL
  447. }
  448. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  449. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  450. {
  451. int exit_status;
  452. infileptr infile_info;
  453. if(!sloom) {
  454. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  455. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  456. return(MEMORY_ERROR);
  457. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  458. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  459. return(PROGRAM_ERROR);
  460. } else if(infile_info->filetype != SNDFILE) {
  461. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  462. return(DATA_ERROR);
  463. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  464. sprintf(errstr,"Failed to copy file parsing information\n");
  465. return(PROGRAM_ERROR);
  466. }
  467. free(infile_info);
  468. }
  469. return(FINISHED);
  470. }
  471. /************************* SETUP_SPIKE_PARAM_RANGES_AND_DEFAULTS *******************/
  472. int setup_spike_param_ranges_and_defaults(dataptr dz)
  473. {
  474. int exit_status;
  475. aplptr ap = dz->application;
  476. // set_param_ranges()
  477. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  478. // NB total_input_param_cnt is > 0 !!!
  479. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  480. return(FAILED);
  481. // get_param_ranges()
  482. ap->lo[0] = 1.0;
  483. ap->hi[0] = 100.0;
  484. ap->default_val[0] = 20;
  485. ap->lo[1] = 1.0;
  486. ap->hi[1] = 100.0;
  487. ap->default_val[1] = 20;
  488. ap->lo[2] = 0.0;
  489. ap->hi[2] = 1;
  490. ap->default_val[2] = 0;
  491. ap->lo[3] = 0.0;
  492. ap->hi[3] = 1;
  493. ap->default_val[3] = 0;
  494. dz->maxmode = 0;
  495. if(!sloom)
  496. put_default_vals_in_all_params(dz);
  497. return(FINISHED);
  498. }
  499. /********************************* PARSE_SLOOM_DATA *********************************/
  500. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  501. {
  502. int exit_status;
  503. int cnt = 1, infilecnt;
  504. int filesize, insams, inbrksize;
  505. double dummy;
  506. int true_cnt = 0;
  507. aplptr ap;
  508. while(cnt<=PRE_CMDLINE_DATACNT) {
  509. if(cnt > argc) {
  510. sprintf(errstr,"Insufficient data sent from TK\n");
  511. return(DATA_ERROR);
  512. }
  513. switch(cnt) {
  514. case(1):
  515. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  516. sprintf(errstr,"Cannot read process no. sent from TK\n");
  517. return(DATA_ERROR);
  518. }
  519. break;
  520. case(2):
  521. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  522. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  523. return(DATA_ERROR);
  524. }
  525. if(dz->mode > 0)
  526. dz->mode--;
  527. //setup_particular_application() =
  528. if((exit_status = setup_spike_application(dz))<0)
  529. return(exit_status);
  530. ap = dz->application;
  531. break;
  532. case(3):
  533. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  534. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  535. return(DATA_ERROR);
  536. }
  537. if(infilecnt < 1) {
  538. true_cnt = cnt + 1;
  539. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  540. }
  541. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  542. return(exit_status);
  543. break;
  544. case(INPUT_FILETYPE+4):
  545. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  546. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  547. return(DATA_ERROR);
  548. }
  549. break;
  550. case(INPUT_FILESIZE+4):
  551. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  552. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  553. return(DATA_ERROR);
  554. }
  555. dz->insams[0] = filesize;
  556. break;
  557. case(INPUT_INSAMS+4):
  558. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  559. sprintf(errstr,"Cannot read insams sent from TK\n");
  560. return(DATA_ERROR);
  561. }
  562. dz->insams[0] = insams;
  563. break;
  564. case(INPUT_SRATE+4):
  565. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  566. sprintf(errstr,"Cannot read srate sent from TK\n");
  567. return(DATA_ERROR);
  568. }
  569. break;
  570. case(INPUT_CHANNELS+4):
  571. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  572. sprintf(errstr,"Cannot read channels sent from TK\n");
  573. return(DATA_ERROR);
  574. }
  575. break;
  576. case(INPUT_STYPE+4):
  577. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  578. sprintf(errstr,"Cannot read stype sent from TK\n");
  579. return(DATA_ERROR);
  580. }
  581. break;
  582. case(INPUT_ORIGSTYPE+4):
  583. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  584. sprintf(errstr,"Cannot read origstype sent from TK\n");
  585. return(DATA_ERROR);
  586. }
  587. break;
  588. case(INPUT_ORIGRATE+4):
  589. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  590. sprintf(errstr,"Cannot read origrate sent from TK\n");
  591. return(DATA_ERROR);
  592. }
  593. break;
  594. case(INPUT_MLEN+4):
  595. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  596. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  597. return(DATA_ERROR);
  598. }
  599. break;
  600. case(INPUT_DFAC+4):
  601. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  602. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  603. return(DATA_ERROR);
  604. }
  605. break;
  606. case(INPUT_ORIGCHANS+4):
  607. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  608. sprintf(errstr,"Cannot read origchans sent from TK\n");
  609. return(DATA_ERROR);
  610. }
  611. break;
  612. case(INPUT_SPECENVCNT+4):
  613. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  614. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  615. return(DATA_ERROR);
  616. }
  617. dz->specenvcnt = dz->infile->specenvcnt;
  618. break;
  619. case(INPUT_WANTED+4):
  620. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  621. sprintf(errstr,"Cannot read wanted sent from TK\n");
  622. return(DATA_ERROR);
  623. }
  624. break;
  625. case(INPUT_WLENGTH+4):
  626. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  627. sprintf(errstr,"Cannot read wlength sent from TK\n");
  628. return(DATA_ERROR);
  629. }
  630. break;
  631. case(INPUT_OUT_CHANS+4):
  632. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  633. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  634. return(DATA_ERROR);
  635. }
  636. break;
  637. /* RWD these chanegs to samps - tk will have to deal with that! */
  638. case(INPUT_DESCRIPTOR_BYTES+4):
  639. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  640. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  641. return(DATA_ERROR);
  642. }
  643. break;
  644. case(INPUT_IS_TRANSPOS+4):
  645. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  646. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  647. return(DATA_ERROR);
  648. }
  649. break;
  650. case(INPUT_COULD_BE_TRANSPOS+4):
  651. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  652. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  653. return(DATA_ERROR);
  654. }
  655. break;
  656. case(INPUT_COULD_BE_PITCH+4):
  657. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  658. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  659. return(DATA_ERROR);
  660. }
  661. break;
  662. case(INPUT_DIFFERENT_SRATES+4):
  663. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  664. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  665. return(DATA_ERROR);
  666. }
  667. break;
  668. case(INPUT_DUPLICATE_SNDS+4):
  669. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  670. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  671. return(DATA_ERROR);
  672. }
  673. break;
  674. case(INPUT_BRKSIZE+4):
  675. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  676. sprintf(errstr,"Cannot read brksize sent from TK\n");
  677. return(DATA_ERROR);
  678. }
  679. if(inbrksize > 0) {
  680. switch(dz->input_data_type) {
  681. case(WORDLIST_ONLY):
  682. break;
  683. case(PITCH_AND_PITCH):
  684. case(PITCH_AND_TRANSPOS):
  685. case(TRANSPOS_AND_TRANSPOS):
  686. dz->tempsize = inbrksize;
  687. break;
  688. case(BRKFILES_ONLY):
  689. case(UNRANGED_BRKFILE_ONLY):
  690. case(DB_BRKFILES_ONLY):
  691. case(ALL_FILES):
  692. case(ANY_NUMBER_OF_ANY_FILES):
  693. if(dz->extrabrkno < 0) {
  694. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  695. return(DATA_ERROR);
  696. }
  697. if(dz->brksize == NULL) {
  698. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  699. return(PROGRAM_ERROR);
  700. }
  701. dz->brksize[dz->extrabrkno] = inbrksize;
  702. break;
  703. default:
  704. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  705. dz->input_data_type);
  706. return(PROGRAM_ERROR);
  707. }
  708. break;
  709. }
  710. break;
  711. case(INPUT_NUMSIZE+4):
  712. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  713. sprintf(errstr,"Cannot read numsize sent from TK\n");
  714. return(DATA_ERROR);
  715. }
  716. break;
  717. case(INPUT_LINECNT+4):
  718. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  719. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  720. return(DATA_ERROR);
  721. }
  722. break;
  723. case(INPUT_ALL_WORDS+4):
  724. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  725. sprintf(errstr,"Cannot read all_words sent from TK\n");
  726. return(DATA_ERROR);
  727. }
  728. break;
  729. case(INPUT_ARATE+4):
  730. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  731. sprintf(errstr,"Cannot read arate sent from TK\n");
  732. return(DATA_ERROR);
  733. }
  734. break;
  735. case(INPUT_FRAMETIME+4):
  736. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  737. sprintf(errstr,"Cannot read frametime sent from TK\n");
  738. return(DATA_ERROR);
  739. }
  740. dz->frametime = (float)dummy;
  741. break;
  742. case(INPUT_WINDOW_SIZE+4):
  743. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  744. sprintf(errstr,"Cannot read window_size sent from TK\n");
  745. return(DATA_ERROR);
  746. }
  747. break;
  748. case(INPUT_NYQUIST+4):
  749. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  750. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  751. return(DATA_ERROR);
  752. }
  753. break;
  754. case(INPUT_DURATION+4):
  755. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  756. sprintf(errstr,"Cannot read duration sent from TK\n");
  757. return(DATA_ERROR);
  758. }
  759. break;
  760. case(INPUT_MINBRK+4):
  761. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  762. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  763. return(DATA_ERROR);
  764. }
  765. break;
  766. case(INPUT_MAXBRK+4):
  767. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  768. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  769. return(DATA_ERROR);
  770. }
  771. break;
  772. case(INPUT_MINNUM+4):
  773. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  774. sprintf(errstr,"Cannot read minnum sent from TK\n");
  775. return(DATA_ERROR);
  776. }
  777. break;
  778. case(INPUT_MAXNUM+4):
  779. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  780. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  781. return(DATA_ERROR);
  782. }
  783. break;
  784. default:
  785. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  786. return(PROGRAM_ERROR);
  787. }
  788. cnt++;
  789. }
  790. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  791. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  792. return(DATA_ERROR);
  793. }
  794. if(true_cnt)
  795. cnt = true_cnt;
  796. *cmdlinecnt = 0;
  797. while(cnt < argc) {
  798. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  799. return(exit_status);
  800. cnt++;
  801. }
  802. return(FINISHED);
  803. }
  804. /********************************* GET_TK_CMDLINE_WORD *********************************/
  805. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  806. {
  807. if(*cmdlinecnt==0) {
  808. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  809. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  810. return(MEMORY_ERROR);
  811. }
  812. } else {
  813. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  814. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  815. return(MEMORY_ERROR);
  816. }
  817. }
  818. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  819. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  820. return(MEMORY_ERROR);
  821. }
  822. strcpy((*cmdline)[*cmdlinecnt],q);
  823. (*cmdlinecnt)++;
  824. return(FINISHED);
  825. }
  826. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  827. int assign_file_data_storage(int infilecnt,dataptr dz)
  828. {
  829. int exit_status;
  830. int no_sndfile_system_files = FALSE;
  831. dz->infilecnt = infilecnt;
  832. if((exit_status = allocate_filespace(dz))<0)
  833. return(exit_status);
  834. if(no_sndfile_system_files)
  835. dz->infilecnt = 0;
  836. return(FINISHED);
  837. }
  838. /************************* redundant functions: to ensure libs compile OK *******************/
  839. int assign_process_logic(dataptr dz)
  840. {
  841. return(FINISHED);
  842. }
  843. void set_legal_infile_structure(dataptr dz)
  844. {}
  845. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  846. {
  847. return(FINISHED);
  848. }
  849. int setup_internal_arrays_and_array_pointers(dataptr dz)
  850. {
  851. return(FINISHED);
  852. }
  853. int establish_bufptrs_and_extra_buffers(dataptr dz)
  854. {
  855. return(FINISHED);
  856. }
  857. int inner_loop
  858. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  859. {
  860. return(FINISHED);
  861. }
  862. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  863. {
  864. return(FINISHED);
  865. }
  866. /******************************** USAGE1 ********************************/
  867. int usage1(void)
  868. {
  869. usage2("spike");
  870. return(USAGE_ONLY);
  871. }
  872. /********************************************************************************************/
  873. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  874. {
  875. if(!strcmp(prog_identifier_from_cmdline,"spike")) dz->process = SPIKE;
  876. else {
  877. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  878. return(USAGE_ONLY);
  879. }
  880. return(FINISHED);
  881. }
  882. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  883. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  884. {
  885. int n;
  886. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  887. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  888. return(MEMORY_ERROR);
  889. }
  890. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  891. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  892. return(MEMORY_ERROR);
  893. }
  894. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  895. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  896. return(MEMORY_ERROR);
  897. }
  898. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  899. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  900. return(MEMORY_ERROR);
  901. }
  902. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  903. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  904. return(MEMORY_ERROR);
  905. }
  906. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  907. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  908. return(MEMORY_ERROR);
  909. }
  910. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  911. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  912. return(MEMORY_ERROR);
  913. }
  914. for(n=0;n<brkcnt;n++) {
  915. dz->brk[n] = NULL;
  916. dz->brkptr[n] = NULL;
  917. dz->brkinit[n] = 0;
  918. dz->brksize[n] = 0;
  919. }
  920. return(FINISHED);
  921. }
  922. /******************************** USAGE2 ********************************/
  923. int usage2(char *str)
  924. {
  925. if(!strcmp(str,"spike")) {
  926. fprintf(stderr,
  927. "USAGE:\n"
  928. "spike spike infile outfile peak(s) upslope downslope [-mmaxup] [-dmaxdown] [-n]\n"
  929. "\n"
  930. "Envelope the input sound to spike at the peak.\n"
  931. "\n"
  932. "PEAKS(S) Is either a single time (single peak) or a list of trof-peak-trof triplets,\n"
  933. " Adjacent trofs may be at the same time, but other times must advance.\n"
  934. "\n"
  935. "UPSLOPE Power-value for slope of envelope before peak(s) Range (1 to 100).\n"
  936. "DOWNSLOPE Power-value for slope of envelope after peak(s) Range (1 to 100).\n"
  937. "\n"
  938. "MAXUP Maximum duration of upward approach: Range (0 to 1 secs).\n"
  939. "MAXDOWN Maximum duration of downward approach: Range (0 to 1 secs).\n"
  940. " (In both cases ZERO implies NO maximum)\n"
  941. "\n"
  942. "-n Raise all peaks to that of maximum.\n"
  943. "\n");
  944. } else
  945. fprintf(stdout,"Unknown option '%s'\n",str);
  946. return(USAGE_ONLY);
  947. }
  948. int usage3(char *str1,char *str2)
  949. {
  950. fprintf(stderr,"Insufficient parameters on command line.\n");
  951. return(USAGE_ONLY);
  952. }
  953. /******************************** SPIKE ********************************/
  954. int spike(dataptr dz)
  955. {
  956. int exit_status, chans = dz->infile->channels, c;
  957. int n, m, i, k, j, samppos, abssamppos, pretrof, pksamp, postrof, prestep, poststep, peakcnt;
  958. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[1];
  959. double *pktrofs = dz->parray[0],*maxvals = dz->parray[1];
  960. double srate = (double)dz->infile->srate;
  961. double maxsamp, maxmax = 0.0, normaliser = 1.0, incr, uppow = dz->param[0], dnpow = dz->param[1];
  962. if(dz->vflag[0]) {
  963. if((exit_status = read_samps(ibuf,dz))<0)
  964. return(exit_status);
  965. memset((char *)obuf,0,dz->buflen * sizeof(float));
  966. pretrof = 0;
  967. samppos = 0;
  968. abssamppos = 0;
  969. peakcnt = 0;
  970. for(n = 0,m = 1,i = 2; n < dz->itemcnt; n+=3,m+=3,i+=3) {
  971. pretrof = (int)round(pktrofs[n] * srate);
  972. pksamp = (int)round(pktrofs[m] * srate);
  973. postrof = (int)round(pktrofs[i] * srate);
  974. prestep = pksamp - pretrof;
  975. poststep = postrof - pksamp;
  976. maxsamp = 0.0;
  977. while(abssamppos < pretrof * chans) {
  978. for(c= 0;c < chans; c++) {
  979. maxmax = max(maxmax,fabs(ibuf[samppos]));
  980. samppos++;
  981. abssamppos++;
  982. }
  983. if(samppos >= dz->ssampsread) {
  984. if((exit_status = read_samps(ibuf,dz))<0)
  985. return(exit_status);
  986. memset((char *)obuf,0,dz->buflen * sizeof(float));
  987. samppos = 0;
  988. }
  989. }
  990. for(k = pretrof,j = 0; k < pksamp; k++,j++) {
  991. incr = (double)j/(double)prestep;
  992. incr = pow(incr,uppow);
  993. for(c= 0;c < chans; c++) {
  994. maxmax = max(maxmax,fabs(ibuf[samppos]));
  995. obuf[samppos] = (float)(ibuf[samppos] * incr);
  996. maxsamp = max(maxsamp,fabs(obuf[samppos]));
  997. samppos++;
  998. abssamppos++;
  999. }
  1000. if(samppos >= dz->ssampsread) {
  1001. if((exit_status = read_samps(ibuf,dz))<0)
  1002. return(exit_status);
  1003. samppos = 0;
  1004. }
  1005. }
  1006. for(k = pksamp,j = 0; k < postrof; k++,j++) {
  1007. incr = 1.0 - ((double)j/(double)poststep);
  1008. incr = pow(incr,dnpow);
  1009. for(c= 0;c < chans; c++) {
  1010. maxmax = max(maxmax,fabs(ibuf[samppos]));
  1011. obuf[samppos] = (float)(ibuf[samppos] * incr);
  1012. maxsamp = max(maxsamp,fabs(obuf[samppos]));
  1013. samppos++;
  1014. abssamppos++;
  1015. }
  1016. if(samppos >= dz->ssampsread) {
  1017. if((exit_status = read_samps(ibuf,dz))<0)
  1018. return(exit_status);
  1019. if(dz->ssampsread == 0)
  1020. break;
  1021. samppos = 0;
  1022. }
  1023. }
  1024. maxvals[peakcnt++] = maxsamp;
  1025. }
  1026. while (dz->ssampsread > 0) {
  1027. while(samppos < dz->ssampsread) {
  1028. for(c= 0;c < chans; c++) {
  1029. maxmax = max(maxmax,fabs(ibuf[samppos]));
  1030. samppos++;
  1031. abssamppos++;
  1032. }
  1033. }
  1034. if((exit_status = read_samps(ibuf,dz))<0)
  1035. return(exit_status);
  1036. }
  1037. maxmax = min(maxmax,0.95);
  1038. sndseekEx(dz->ifd[0],0,0);
  1039. for(n=0;n < peakcnt;n++)
  1040. maxvals[n] = maxmax/maxvals[n]; // convert to a normaliser
  1041. reset_filedata_counters(dz);
  1042. }
  1043. if((exit_status = read_samps(ibuf,dz))<0)
  1044. return(exit_status);
  1045. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1046. pretrof = 0;
  1047. samppos = 0;
  1048. abssamppos = 0;
  1049. peakcnt = 0;
  1050. for(n = 0,m = 1,i = 2; n < dz->itemcnt; n+=3,m+=3,i+=3) {
  1051. pretrof = (int)round(pktrofs[n] * srate);
  1052. pksamp = (int)round(pktrofs[m] * srate);
  1053. postrof = (int)round(pktrofs[i] * srate);
  1054. if(dz->vflag[0])
  1055. normaliser = maxvals[peakcnt++];
  1056. prestep = pksamp - pretrof;
  1057. poststep = postrof - pksamp;
  1058. while(abssamppos < pretrof * chans) {
  1059. samppos += chans;
  1060. abssamppos += chans;
  1061. if(samppos >= dz->ssampsread) {
  1062. if((exit_status = write_samps(obuf,dz->ssampsread,dz))<0)
  1063. return(exit_status);
  1064. if((exit_status = read_samps(ibuf,dz))<0)
  1065. return(exit_status);
  1066. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1067. samppos = 0;
  1068. }
  1069. }
  1070. for(k = pretrof,j = 0; k < pksamp; k++,j++) {
  1071. incr = (double)j/(double)prestep;
  1072. incr = pow(incr,uppow);
  1073. for(c= 0;c < chans; c++) {
  1074. obuf[samppos] = (float)(ibuf[samppos] * incr);
  1075. if(dz->vflag[0])
  1076. obuf[samppos] = (float)(obuf[samppos] * normaliser);
  1077. samppos++;
  1078. abssamppos++;
  1079. }
  1080. if(samppos >= dz->ssampsread) {
  1081. if((exit_status = write_samps(obuf,dz->ssampsread,dz))<0)
  1082. return(exit_status);
  1083. if((exit_status = read_samps(ibuf,dz))<0)
  1084. return(exit_status);
  1085. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1086. samppos = 0;
  1087. }
  1088. }
  1089. for(k = pksamp,j = 0; k < postrof; k++,j++) {
  1090. incr = 1.0 - ((double)j/(double)poststep);
  1091. incr = pow(incr,dnpow);
  1092. for(c= 0;c < chans; c++) {
  1093. obuf[samppos] = (float)(ibuf[samppos] * incr);
  1094. if(dz->vflag[0])
  1095. obuf[samppos] = (float)(obuf[samppos] * normaliser);
  1096. samppos++;
  1097. abssamppos++;
  1098. }
  1099. if(samppos >= dz->ssampsread) {
  1100. if((exit_status = write_samps(obuf,dz->ssampsread,dz))<0)
  1101. return(exit_status);
  1102. if((exit_status = read_samps(ibuf,dz))<0)
  1103. return(exit_status);
  1104. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1105. if(dz->ssampsread == 0)
  1106. break;
  1107. samppos = 0;
  1108. }
  1109. }
  1110. }
  1111. while(dz->ssampsread > 0) {
  1112. if((exit_status = write_samps(obuf,dz->ssampsread,dz))<0)
  1113. return(exit_status);
  1114. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1115. if((exit_status = read_samps(ibuf,dz))<0)
  1116. return(exit_status);
  1117. }
  1118. return FINISHED;
  1119. }
  1120. /************************ HANDLE_THE_SPECIAL_DATA *********************/
  1121. int handle_the_special_data(int *cmdlinecnt,char ***cmdline,dataptr dz)
  1122. {
  1123. int exit_status;
  1124. aplptr ap = dz->application;
  1125. if(ap->special_data) {
  1126. if(!sloom) {
  1127. if(*cmdlinecnt <= 0) {
  1128. sprintf(errstr,"Insufficient parameters on command line.\n");
  1129. return(USAGE_ONLY);
  1130. }
  1131. }
  1132. if((exit_status = read_special_data((*cmdline)[0],dz))<0)
  1133. return(exit_status);
  1134. (*cmdline)++;
  1135. (*cmdlinecnt)--;
  1136. }
  1137. return(FINISHED);
  1138. }
  1139. /*************************** GET_FOFBANK_INFO ***********************/
  1140. int read_special_data(char *filename,dataptr dz)
  1141. {
  1142. FILE *fp;
  1143. double dummy, lasttime = 0.0;
  1144. int cnt, peakcnt;
  1145. double *vals;
  1146. char temp[200], *q;
  1147. q = filename;
  1148. if((dz->parray = (double **)malloc(2 * sizeof(double *)))==NULL) {
  1149. sprintf(errstr,"INSUFFICIENT MEMORY for data in file %s (1).\n",filename);
  1150. return(MEMORY_ERROR);
  1151. }
  1152. if((sloom && *q == '@') || (!sloom && value_is_numeric(filename))) {
  1153. if((dz->parray[0] = (double *)malloc(3 * sizeof(double)))==NULL) {
  1154. sprintf(errstr,"INSUFFICIENT MEMORY for data in file %s (2).\n",filename);
  1155. return(MEMORY_ERROR);
  1156. }
  1157. if(sloom)
  1158. q++;
  1159. dummy = (double)atof(q);
  1160. if(dummy <= 0.0) {
  1161. sprintf(errstr,"Invalid peak time (%lf) at or before sound start, %s\n",dummy,filename);
  1162. return(MEMORY_ERROR);
  1163. }
  1164. if(dummy >= dz->duration) {
  1165. sprintf(errstr,"Invalid peak time (%lf) at or beyond sound end (%lf), %s\n",dummy,dz->duration,filename);
  1166. return(MEMORY_ERROR);
  1167. }
  1168. dz->parray[0][0] = 0.0;
  1169. dz->parray[0][1] = dummy;
  1170. dz->parray[0][2] = dz->duration;
  1171. dz->itemcnt = 3;
  1172. return(FINISHED);
  1173. }
  1174. if((fp = fopen(filename,"r"))==NULL) {
  1175. sprintf(errstr, "Can't open file %s to read data.\n",filename);
  1176. return(DATA_ERROR);
  1177. }
  1178. cnt = 0;
  1179. while(fgets(temp,200,fp)==temp) {
  1180. q = temp;
  1181. if(*q == ';') // Allow comments in file
  1182. continue;
  1183. while(get_float_from_within_string(&q,&dummy)) {
  1184. if(cnt % 3 == 0) {
  1185. if (dummy < lasttime) {
  1186. sprintf(errstr,"Times between peaks (%lf and %lf) regress in file %s\n",lasttime,dummy,filename); //RWD first was $lf
  1187. return DATA_ERROR;
  1188. }
  1189. } else {
  1190. if (dummy <= lasttime) {
  1191. sprintf(errstr,"Times within peaks (%lf and %lf) do not progress in file %s\n",lasttime,dummy,filename); //RWD ditto
  1192. return DATA_ERROR;
  1193. }
  1194. }
  1195. if(dummy > dz->duration) {
  1196. sprintf(errstr,"Invalid peak time (%lf) at or beyond sound end (%lf), in file %s.\n",dummy,dz->duration,filename);
  1197. return(MEMORY_ERROR);
  1198. }
  1199. lasttime = dummy;
  1200. cnt++;
  1201. }
  1202. }
  1203. if(cnt == 0) {
  1204. sprintf(errstr,"No data in file %s\n",filename);
  1205. return(DATA_ERROR);
  1206. }
  1207. if(cnt % 3 != 0) {
  1208. sprintf(errstr,"Data in file %s not grouped in triplets : should be sets of TROF PK TROF.\n",filename);
  1209. return(DATA_ERROR);
  1210. }
  1211. if((dz->parray[0] = (double *)malloc(cnt * sizeof(double)))==NULL) {
  1212. sprintf(errstr,"INSUFFICIENT MEMORY for data in file %s.\n",filename);
  1213. return(MEMORY_ERROR);
  1214. }
  1215. vals = dz->parray[0];
  1216. rewind(fp);
  1217. cnt = 0;
  1218. while(fgets(temp,200,fp)==temp) {
  1219. q = temp;
  1220. if(*q == ';') // Allow comments in file
  1221. continue;
  1222. while(get_float_from_within_string(&q,&dummy)) {
  1223. vals[cnt] = dummy;
  1224. }
  1225. cnt++;
  1226. }
  1227. if(fclose(fp)<0) {
  1228. fprintf(stdout,"WARNING: Failed to close file %s.\n",filename);
  1229. fflush(stdout);
  1230. }
  1231. dz->itemcnt = cnt;
  1232. peakcnt = dz->itemcnt/3;
  1233. if(peakcnt) {
  1234. if((dz->parray[1] = (double *)malloc(peakcnt * sizeof(double)))==NULL) {
  1235. sprintf(errstr,"INSUFFICIENT MEMORY for data in file %s (2).\n",filename);
  1236. return(MEMORY_ERROR);
  1237. }
  1238. }
  1239. return(FINISHED);
  1240. }
  1241. void TrimPeakData(dataptr dz)
  1242. {
  1243. double upmax = dz->param[2], dnmax = dz->param[3], upstep, dnstep;
  1244. double *pktrofs = dz->parray[0];
  1245. int n, m, i;
  1246. for(n = 0,m = 1,i = 2; n < dz->itemcnt; n+=3,m+=3,i+=3) {
  1247. /* TEST */
  1248. fprintf(stderr,"BEFORE: upstep %lf dnstep %lf\n",pktrofs[m] - pktrofs[n],pktrofs[i] - pktrofs[m]);
  1249. /* TEST */
  1250. if(dz->param[2] > 0.0) {
  1251. upstep = pktrofs[m] - pktrofs[n];
  1252. if(upstep > upmax)
  1253. pktrofs[n] = pktrofs[m] - upmax;
  1254. }
  1255. if(dz->param[3] > 0.0) {
  1256. dnstep = pktrofs[i] - pktrofs[m];
  1257. if(dnstep > dnmax)
  1258. pktrofs[i] = pktrofs[m] + dnmax;
  1259. }
  1260. /* TEST */
  1261. fprintf(stderr,"AFTER: upstep %lf dnstep %lf\n",pktrofs[m] - pktrofs[n],pktrofs[i] - pktrofs[m]);
  1262. /* TEST */
  1263. }
  1264. }