clip.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244
  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_clip_param_validity_and_consistency(dataptr dz);
  30. static int setup_clip_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_clip_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 get_the_mode_from_cmdline(char *str,dataptr dz);
  46. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  47. static int create_long_sndbuf(dataptr dz); //RWD may as well keep this as "long"
  48. static int clip(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 = 2;
  99. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  100. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  101. return(exit_status);
  102. }
  103. cmdline++;
  104. cmdlinecnt--;
  105. // setup_particular_application =
  106. if((exit_status = setup_clip_application(dz))<0) {
  107. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  108. return(FAILED);
  109. }
  110. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  111. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  112. return(FAILED);
  113. }
  114. } else {
  115. //parse_TK_data() =
  116. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  117. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  118. return(exit_status);
  119. }
  120. }
  121. ap = dz->application;
  122. // parse_infile_and_hone_type() =
  123. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  124. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  125. return(FAILED);
  126. }
  127. // setup_param_ranges_and_defaults() =
  128. if((exit_status = setup_clip_param_ranges_and_defaults(dz))<0) {
  129. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  130. return(FAILED);
  131. }
  132. // open_first_infile CDP LIB
  133. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  134. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  135. return(FAILED);
  136. }
  137. cmdlinecnt--;
  138. cmdline++;
  139. // handle_extra_infiles() : redundant
  140. // handle_outfile() =
  141. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  142. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  143. return(FAILED);
  144. }
  145. // handle_formants() redundant
  146. // handle_formant_quiksearch() redundant
  147. // handle_special_data() redundant
  148. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  149. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  150. return(FAILED);
  151. }
  152. // check_param_validity_and_consistency....
  153. if((exit_status = check_clip_param_validity_and_consistency(dz))<0) {
  154. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  155. return(FAILED);
  156. }
  157. is_launched = TRUE;
  158. dz->bufcnt = 1;
  159. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  160. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  161. return(MEMORY_ERROR);
  162. }
  163. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  164. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  165. return(MEMORY_ERROR);
  166. }
  167. for(n = 0;n <dz->bufcnt; n++)
  168. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  169. dz->sampbuf[n] = (float *)0;
  170. if(dz->mode == 0) {
  171. if((exit_status = create_sndbufs(dz))<0) { // CDP LIB
  172. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  173. return(FAILED);
  174. }
  175. } else {
  176. if((exit_status = create_long_sndbuf(dz))<0) {
  177. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  178. return(FAILED);
  179. }
  180. }
  181. //param_preprocess() redundant
  182. //spec_process_file =
  183. if((exit_status = clip(dz))<0) {
  184. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  185. return(FAILED);
  186. }
  187. if((exit_status = complete_output(dz))<0) { // CDP LIB
  188. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  189. return(FAILED);
  190. }
  191. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  192. free(dz);
  193. return(SUCCEEDED);
  194. }
  195. /**********************************************
  196. REPLACED CDP LIB FUNCTIONS
  197. **********************************************/
  198. /****************************** SET_PARAM_DATA *********************************/
  199. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  200. {
  201. ap->special_data = (char)special_data;
  202. ap->param_cnt = (char)paramcnt;
  203. ap->max_param_cnt = (char)maxparamcnt;
  204. if(ap->max_param_cnt>0) {
  205. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  206. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  207. return(MEMORY_ERROR);
  208. }
  209. strcpy(ap->param_list,paramlist);
  210. }
  211. return(FINISHED);
  212. }
  213. /****************************** SET_VFLGS *********************************/
  214. int set_vflgs
  215. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  216. {
  217. ap->option_cnt = (char) optcnt; /*RWD added cast */
  218. if(optcnt) {
  219. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  220. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  221. return(MEMORY_ERROR);
  222. }
  223. strcpy(ap->option_list,optlist);
  224. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  225. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  226. return(MEMORY_ERROR);
  227. }
  228. strcpy(ap->option_flags,optflags);
  229. }
  230. ap->vflag_cnt = (char) vflagcnt;
  231. ap->variant_param_cnt = (char) vparamcnt;
  232. if(vflagcnt) {
  233. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  234. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  235. return(MEMORY_ERROR);
  236. }
  237. strcpy(ap->variant_list,varlist);
  238. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  239. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  240. return(MEMORY_ERROR);
  241. }
  242. strcpy(ap->variant_flags,varflags);
  243. }
  244. return(FINISHED);
  245. }
  246. /***************************** APPLICATION_INIT **************************/
  247. int application_init(dataptr dz)
  248. {
  249. int exit_status;
  250. int storage_cnt;
  251. int tipc, brkcnt;
  252. aplptr ap = dz->application;
  253. if(ap->vflag_cnt>0)
  254. initialise_vflags(dz);
  255. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  256. ap->total_input_param_cnt = (char)tipc;
  257. if(tipc>0) {
  258. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  259. return(exit_status);
  260. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  261. return(exit_status);
  262. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  263. return(exit_status);
  264. }
  265. brkcnt = tipc;
  266. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  267. if(brkcnt>0) {
  268. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  269. return(exit_status);
  270. }
  271. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  272. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  273. return(exit_status);
  274. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  275. return(exit_status);
  276. }
  277. if((exit_status = mark_parameter_types(dz,ap))<0)
  278. return(exit_status);
  279. // establish_infile_constants() replaced by
  280. dz->infilecnt = 1;
  281. //establish_bufptrs_and_extra_buffers():
  282. return(FINISHED);
  283. }
  284. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  285. /* RWD mallo changed to calloc; helps debug verison run as release! */
  286. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  287. {
  288. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  289. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  290. return(MEMORY_ERROR);
  291. }
  292. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  293. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  294. return(MEMORY_ERROR);
  295. }
  296. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  297. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  298. return(MEMORY_ERROR);
  299. }
  300. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  301. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  302. return(MEMORY_ERROR);
  303. }
  304. return(FINISHED);
  305. }
  306. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  307. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  308. {
  309. int n;
  310. for(n=0;n<storage_cnt;n++) {
  311. dz->is_int[n] = (char)0;
  312. dz->no_brk[n] = (char)0;
  313. }
  314. return(FINISHED);
  315. }
  316. /***************************** MARK_PARAMETER_TYPES **************************/
  317. int mark_parameter_types(dataptr dz,aplptr ap)
  318. {
  319. int n, m; /* PARAMS */
  320. for(n=0;n<ap->max_param_cnt;n++) {
  321. switch(ap->param_list[n]) {
  322. case('0'): break; /* dz->is_active[n] = 0 is default */
  323. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  324. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  325. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  326. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  327. default:
  328. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  329. return(PROGRAM_ERROR);
  330. }
  331. } /* OPTIONS */
  332. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  333. switch(ap->option_list[n]) {
  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 option type in mark_parameter_types()\n");
  340. return(PROGRAM_ERROR);
  341. }
  342. } /* VARIANTS */
  343. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  344. switch(ap->variant_list[n]) {
  345. case('0'): break;
  346. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  347. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  348. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  349. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  350. default:
  351. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  352. return(PROGRAM_ERROR);
  353. }
  354. } /* INTERNAL */
  355. for(n=0,
  356. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  357. switch(ap->internal_param_list[n]) {
  358. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  359. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  360. case('d'): dz->no_brk[m] = (char)1; break;
  361. default:
  362. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  363. return(PROGRAM_ERROR);
  364. }
  365. }
  366. return(FINISHED);
  367. }
  368. /************************ HANDLE_THE_OUTFILE *********************/
  369. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  370. {
  371. int exit_status;
  372. char *filename = (*cmdline)[0];
  373. if(filename[0]=='-' && filename[1]=='f') {
  374. dz->floatsam_output = 1;
  375. dz->true_outfile_stype = SAMP_FLOAT;
  376. filename+= 2;
  377. }
  378. if(!sloom) {
  379. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  380. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  381. return(DATA_ERROR);
  382. }
  383. }
  384. strcpy(dz->outfilename,filename);
  385. if((exit_status = create_sized_outfile(filename,dz))<0)
  386. return(exit_status);
  387. (*cmdline)++;
  388. (*cmdlinecnt)--;
  389. return(FINISHED);
  390. }
  391. /***************************** ESTABLISH_APPLICATION **************************/
  392. int establish_application(dataptr dz)
  393. {
  394. aplptr ap;
  395. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  396. sprintf(errstr,"establish_application()\n");
  397. return(MEMORY_ERROR);
  398. }
  399. ap = dz->application;
  400. memset((char *)ap,0,sizeof(struct applic));
  401. return(FINISHED);
  402. }
  403. /************************* INITIALISE_VFLAGS *************************/
  404. int initialise_vflags(dataptr dz)
  405. {
  406. int n;
  407. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  408. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  409. return(MEMORY_ERROR);
  410. }
  411. for(n=0;n<dz->application->vflag_cnt;n++)
  412. dz->vflag[n] = FALSE;
  413. return FINISHED;
  414. }
  415. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  416. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  417. {
  418. int n;
  419. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  420. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  421. return(MEMORY_ERROR);
  422. }
  423. for(n=0;n<tipc;n++)
  424. ap->default_val[n] = 0.0;
  425. return(FINISHED);
  426. }
  427. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  428. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  429. {
  430. int n;
  431. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  432. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  433. return(MEMORY_ERROR);
  434. }
  435. for(n=0;n<tipc;n++)
  436. dz->is_active[n] = (char)0;
  437. return(FINISHED);
  438. }
  439. /************************* SETUP_CLIP_APPLICATION *******************/
  440. int setup_clip_application(dataptr dz)
  441. {
  442. int exit_status;
  443. aplptr ap;
  444. if((exit_status = establish_application(dz))<0) // GLOBAL
  445. return(FAILED);
  446. ap = dz->application;
  447. // SEE parstruct FOR EXPLANATION of next 2 functions
  448. switch(dz->mode) {
  449. case(0): // fall thro
  450. case(1):
  451. exit_status = set_param_data(ap,0 ,1,1,"d");
  452. break;
  453. }
  454. if(exit_status <0)
  455. return(FAILED);
  456. if((exit_status = set_vflgs(ap,"",0,"","",0,0,""))<0)
  457. return(FAILED);
  458. // set_legal_infile_structure -->
  459. dz->has_otherfile = FALSE;
  460. // assign_process_logic -->
  461. dz->input_data_type = SNDFILES_ONLY;
  462. dz->process_type = EQUAL_SNDFILE;
  463. dz->outfiletype = SNDFILE_OUT;
  464. return application_init(dz); //GLOBAL
  465. }
  466. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  467. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  468. {
  469. int exit_status;
  470. infileptr infile_info;
  471. if(!sloom) {
  472. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  473. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  474. return(MEMORY_ERROR);
  475. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  476. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  477. return(PROGRAM_ERROR);
  478. } else if(infile_info->filetype != SNDFILE) {
  479. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  480. return(DATA_ERROR);
  481. } else if(dz->mode == 1 && infile_info->channels != 1) {
  482. sprintf(errstr,"File %s is not of correct type (must be mono)\n",cmdline[0]);
  483. return(DATA_ERROR);
  484. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  485. sprintf(errstr,"Failed to copy file parsing information\n");
  486. return(PROGRAM_ERROR);
  487. }
  488. free(infile_info);
  489. }
  490. return(FINISHED);
  491. }
  492. /************************* SETUP_CLIP_PARAM_RANGES_AND_DEFAULTS *******************/
  493. int setup_clip_param_ranges_and_defaults(dataptr dz)
  494. {
  495. int exit_status;
  496. aplptr ap = dz->application;
  497. // set_param_ranges()
  498. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  499. // NB total_input_param_cnt is > 0 !!!
  500. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  501. return(FAILED);
  502. // get_param_ranges()
  503. switch(dz->mode) {
  504. case(0):
  505. ap->lo[0] = 0.0; // clip level
  506. ap->hi[0] = 1.0;
  507. ap->default_val[0] = 0.1;
  508. case(1):
  509. ap->lo[0] = 0.0; // clip fraction of half-waveset level
  510. ap->hi[0] = 1.0;
  511. ap->default_val[0] = 0.5;
  512. break;
  513. }
  514. dz->maxmode = 2;
  515. if(!sloom)
  516. put_default_vals_in_all_params(dz);
  517. return(FINISHED);
  518. }
  519. /********************************* PARSE_SLOOM_DATA *********************************/
  520. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  521. {
  522. int exit_status;
  523. int cnt = 1, infilecnt;
  524. int filesize, insams, inbrksize;
  525. double dummy;
  526. int true_cnt = 0;
  527. aplptr ap;
  528. while(cnt<=PRE_CMDLINE_DATACNT) {
  529. if(cnt > argc) {
  530. sprintf(errstr,"Insufficient data sent from TK\n");
  531. return(DATA_ERROR);
  532. }
  533. switch(cnt) {
  534. case(1):
  535. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  536. sprintf(errstr,"Cannot read process no. sent from TK\n");
  537. return(DATA_ERROR);
  538. }
  539. break;
  540. case(2):
  541. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  542. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  543. return(DATA_ERROR);
  544. }
  545. if(dz->mode > 0)
  546. dz->mode--;
  547. //setup_particular_application() =
  548. if((exit_status = setup_clip_application(dz))<0)
  549. return(exit_status);
  550. ap = dz->application;
  551. break;
  552. case(3):
  553. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  554. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  555. return(DATA_ERROR);
  556. }
  557. if(infilecnt < 1) {
  558. true_cnt = cnt + 1;
  559. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  560. }
  561. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  562. return(exit_status);
  563. break;
  564. case(INPUT_FILETYPE+4):
  565. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  566. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  567. return(DATA_ERROR);
  568. }
  569. break;
  570. case(INPUT_FILESIZE+4):
  571. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  572. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  573. return(DATA_ERROR);
  574. }
  575. dz->insams[0] = filesize;
  576. break;
  577. case(INPUT_INSAMS+4):
  578. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  579. sprintf(errstr,"Cannot read insams sent from TK\n");
  580. return(DATA_ERROR);
  581. }
  582. dz->insams[0] = insams;
  583. break;
  584. case(INPUT_SRATE+4):
  585. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  586. sprintf(errstr,"Cannot read srate sent from TK\n");
  587. return(DATA_ERROR);
  588. }
  589. break;
  590. case(INPUT_CHANNELS+4):
  591. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  592. sprintf(errstr,"Cannot read channels sent from TK\n");
  593. return(DATA_ERROR);
  594. }
  595. break;
  596. case(INPUT_STYPE+4):
  597. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  598. sprintf(errstr,"Cannot read stype sent from TK\n");
  599. return(DATA_ERROR);
  600. }
  601. break;
  602. case(INPUT_ORIGSTYPE+4):
  603. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  604. sprintf(errstr,"Cannot read origstype sent from TK\n");
  605. return(DATA_ERROR);
  606. }
  607. break;
  608. case(INPUT_ORIGRATE+4):
  609. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  610. sprintf(errstr,"Cannot read origrate sent from TK\n");
  611. return(DATA_ERROR);
  612. }
  613. break;
  614. case(INPUT_MLEN+4):
  615. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  616. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  617. return(DATA_ERROR);
  618. }
  619. break;
  620. case(INPUT_DFAC+4):
  621. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  622. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  623. return(DATA_ERROR);
  624. }
  625. break;
  626. case(INPUT_ORIGCHANS+4):
  627. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  628. sprintf(errstr,"Cannot read origchans sent from TK\n");
  629. return(DATA_ERROR);
  630. }
  631. break;
  632. case(INPUT_SPECENVCNT+4):
  633. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  634. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  635. return(DATA_ERROR);
  636. }
  637. dz->specenvcnt = dz->infile->specenvcnt;
  638. break;
  639. case(INPUT_WANTED+4):
  640. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  641. sprintf(errstr,"Cannot read wanted sent from TK\n");
  642. return(DATA_ERROR);
  643. }
  644. break;
  645. case(INPUT_WLENGTH+4):
  646. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  647. sprintf(errstr,"Cannot read wlength sent from TK\n");
  648. return(DATA_ERROR);
  649. }
  650. break;
  651. case(INPUT_OUT_CHANS+4):
  652. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  653. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  654. return(DATA_ERROR);
  655. }
  656. break;
  657. /* RWD these chanegs to samps - tk will have to deal with that! */
  658. case(INPUT_DESCRIPTOR_BYTES+4):
  659. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  660. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  661. return(DATA_ERROR);
  662. }
  663. break;
  664. case(INPUT_IS_TRANSPOS+4):
  665. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  666. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  667. return(DATA_ERROR);
  668. }
  669. break;
  670. case(INPUT_COULD_BE_TRANSPOS+4):
  671. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  672. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  673. return(DATA_ERROR);
  674. }
  675. break;
  676. case(INPUT_COULD_BE_PITCH+4):
  677. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  678. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  679. return(DATA_ERROR);
  680. }
  681. break;
  682. case(INPUT_DIFFERENT_SRATES+4):
  683. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  684. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  685. return(DATA_ERROR);
  686. }
  687. break;
  688. case(INPUT_DUPLICATE_SNDS+4):
  689. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  690. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  691. return(DATA_ERROR);
  692. }
  693. break;
  694. case(INPUT_BRKSIZE+4):
  695. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  696. sprintf(errstr,"Cannot read brksize sent from TK\n");
  697. return(DATA_ERROR);
  698. }
  699. if(inbrksize > 0) {
  700. switch(dz->input_data_type) {
  701. case(WORDLIST_ONLY):
  702. break;
  703. case(PITCH_AND_PITCH):
  704. case(PITCH_AND_TRANSPOS):
  705. case(TRANSPOS_AND_TRANSPOS):
  706. dz->tempsize = inbrksize;
  707. break;
  708. case(BRKFILES_ONLY):
  709. case(UNRANGED_BRKFILE_ONLY):
  710. case(DB_BRKFILES_ONLY):
  711. case(ALL_FILES):
  712. case(ANY_NUMBER_OF_ANY_FILES):
  713. if(dz->extrabrkno < 0) {
  714. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  715. return(DATA_ERROR);
  716. }
  717. if(dz->brksize == NULL) {
  718. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  719. return(PROGRAM_ERROR);
  720. }
  721. dz->brksize[dz->extrabrkno] = inbrksize;
  722. break;
  723. default:
  724. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  725. dz->input_data_type);
  726. return(PROGRAM_ERROR);
  727. }
  728. break;
  729. }
  730. break;
  731. case(INPUT_NUMSIZE+4):
  732. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  733. sprintf(errstr,"Cannot read numsize sent from TK\n");
  734. return(DATA_ERROR);
  735. }
  736. break;
  737. case(INPUT_LINECNT+4):
  738. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  739. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  740. return(DATA_ERROR);
  741. }
  742. break;
  743. case(INPUT_ALL_WORDS+4):
  744. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  745. sprintf(errstr,"Cannot read all_words sent from TK\n");
  746. return(DATA_ERROR);
  747. }
  748. break;
  749. case(INPUT_ARATE+4):
  750. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  751. sprintf(errstr,"Cannot read arate sent from TK\n");
  752. return(DATA_ERROR);
  753. }
  754. break;
  755. case(INPUT_FRAMETIME+4):
  756. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  757. sprintf(errstr,"Cannot read frametime sent from TK\n");
  758. return(DATA_ERROR);
  759. }
  760. dz->frametime = (float)dummy;
  761. break;
  762. case(INPUT_WINDOW_SIZE+4):
  763. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  764. sprintf(errstr,"Cannot read window_size sent from TK\n");
  765. return(DATA_ERROR);
  766. }
  767. break;
  768. case(INPUT_NYQUIST+4):
  769. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  770. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  771. return(DATA_ERROR);
  772. }
  773. break;
  774. case(INPUT_DURATION+4):
  775. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  776. sprintf(errstr,"Cannot read duration sent from TK\n");
  777. return(DATA_ERROR);
  778. }
  779. break;
  780. case(INPUT_MINBRK+4):
  781. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  782. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  783. return(DATA_ERROR);
  784. }
  785. break;
  786. case(INPUT_MAXBRK+4):
  787. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  788. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  789. return(DATA_ERROR);
  790. }
  791. break;
  792. case(INPUT_MINNUM+4):
  793. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  794. sprintf(errstr,"Cannot read minnum sent from TK\n");
  795. return(DATA_ERROR);
  796. }
  797. break;
  798. case(INPUT_MAXNUM+4):
  799. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  800. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  801. return(DATA_ERROR);
  802. }
  803. break;
  804. default:
  805. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  806. return(PROGRAM_ERROR);
  807. }
  808. cnt++;
  809. }
  810. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  811. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  812. return(DATA_ERROR);
  813. }
  814. if(true_cnt)
  815. cnt = true_cnt;
  816. *cmdlinecnt = 0;
  817. while(cnt < argc) {
  818. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  819. return(exit_status);
  820. cnt++;
  821. }
  822. return(FINISHED);
  823. }
  824. /********************************* GET_TK_CMDLINE_WORD *********************************/
  825. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  826. {
  827. if(*cmdlinecnt==0) {
  828. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  829. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  830. return(MEMORY_ERROR);
  831. }
  832. } else {
  833. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  834. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  835. return(MEMORY_ERROR);
  836. }
  837. }
  838. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  839. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  840. return(MEMORY_ERROR);
  841. }
  842. strcpy((*cmdline)[*cmdlinecnt],q);
  843. (*cmdlinecnt)++;
  844. return(FINISHED);
  845. }
  846. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  847. int assign_file_data_storage(int infilecnt,dataptr dz)
  848. {
  849. int exit_status;
  850. int no_sndfile_system_files = FALSE;
  851. dz->infilecnt = infilecnt;
  852. if((exit_status = allocate_filespace(dz))<0)
  853. return(exit_status);
  854. if(no_sndfile_system_files)
  855. dz->infilecnt = 0;
  856. return(FINISHED);
  857. }
  858. /************************* redundant functions: to ensure libs compile OK *******************/
  859. int assign_process_logic(dataptr dz)
  860. {
  861. return(FINISHED);
  862. }
  863. void set_legal_infile_structure(dataptr dz)
  864. {}
  865. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  866. {
  867. return(FINISHED);
  868. }
  869. int setup_internal_arrays_and_array_pointers(dataptr dz)
  870. {
  871. return(FINISHED);
  872. }
  873. int establish_bufptrs_and_extra_buffers(dataptr dz)
  874. {
  875. return(FINISHED);
  876. }
  877. int read_special_data(char *str,dataptr dz)
  878. {
  879. return(FINISHED);
  880. }
  881. int inner_loop
  882. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  883. {
  884. return(FINISHED);
  885. }
  886. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  887. {
  888. return(FINISHED);
  889. }
  890. /******************************** USAGE1 ********************************/
  891. int usage1(void)
  892. {
  893. usage2("clip");
  894. return(USAGE_ONLY);
  895. }
  896. /**************************** CHECK_CLIP_PARAM_VALIDITY_AND_CONSISTENCY *****************************/
  897. int check_clip_param_validity_and_consistency(dataptr dz)
  898. {
  899. if(dz->param[0] <= 0.0) {
  900. sprintf(errstr,"No distortion with a zero parameter value.\n");
  901. return(DATA_ERROR);
  902. }
  903. // TW Mar: 2015
  904. // dz->iparam[1] = (int)round(dz->param[1] * (double)(dz->infile->srate * dz->infile->channels));
  905. return FINISHED;
  906. }
  907. /********************************************************************************************/
  908. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  909. {
  910. if(!strcmp(prog_identifier_from_cmdline,"clip")) dz->process = CLIP;
  911. else {
  912. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  913. return(USAGE_ONLY);
  914. }
  915. return(FINISHED);
  916. }
  917. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  918. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  919. {
  920. int n;
  921. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  922. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  923. return(MEMORY_ERROR);
  924. }
  925. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  926. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  927. return(MEMORY_ERROR);
  928. }
  929. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  930. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  931. return(MEMORY_ERROR);
  932. }
  933. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  934. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  935. return(MEMORY_ERROR);
  936. }
  937. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  938. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  939. return(MEMORY_ERROR);
  940. }
  941. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  942. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  943. return(MEMORY_ERROR);
  944. }
  945. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  946. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  947. return(MEMORY_ERROR);
  948. }
  949. for(n=0;n<brkcnt;n++) {
  950. dz->brk[n] = NULL;
  951. dz->brkptr[n] = NULL;
  952. dz->brkinit[n] = 0;
  953. dz->brksize[n] = 0;
  954. }
  955. return(FINISHED);
  956. }
  957. /******************************** USAGE2 ********************************/
  958. int usage2(char *str)
  959. {
  960. if(!strcmp(str,"clip")) {
  961. fprintf(stderr,
  962. "USAGE:\n"
  963. "clip clip mode infile outfile params\n"
  964. "\n"
  965. "Mode 1: Clip signal at specified level.\n"
  966. "Mode 2: Clip half-waveforms at specified fraction.\n"
  967. "\n");
  968. } else
  969. fprintf(stdout,"Unknown option '%s'\n",str);
  970. return(USAGE_ONLY);
  971. }
  972. int usage3(char *str1,char *str2)
  973. {
  974. fprintf(stderr,"Insufficient parameters on command line.\n");
  975. return(USAGE_ONLY);
  976. }
  977. /******************************** CLIP ********************************/
  978. int clip(dataptr dz)
  979. {
  980. int exit_status, chans = dz->infile->channels;
  981. float *ibuf = dz->sampbuf[0];
  982. double gain;
  983. float *maxsamp = NULL, *minsamp = NULL;
  984. float localmin, localmax;
  985. int *phase = NULL;
  986. int *halfwavsetstart = NULL, n = 0, m, j, k;
  987. if((maxsamp = (float *)malloc(chans * sizeof(float)))==NULL) {
  988. sprintf(errstr,"INSUFFICIENT MEMORY for maximum sample storage.\n");
  989. return(MEMORY_ERROR);
  990. }
  991. if(dz->mode == 1) {
  992. if((minsamp = (float *)malloc(chans * sizeof(float)))==NULL) {
  993. sprintf(errstr,"INSUFFICIENT MEMORY for minimum sample storage.\n");
  994. return(MEMORY_ERROR);
  995. }
  996. if((phase = (int *)malloc(chans * sizeof(int)))==NULL) {
  997. sprintf(errstr,"INSUFFICIENT MEMORY for phase-flags.\n");
  998. return(MEMORY_ERROR);
  999. }
  1000. if((halfwavsetstart = (int *)malloc(chans * sizeof(int)))==NULL) {
  1001. sprintf(errstr,"INSUFFICIENT MEMORY for waveset start-marker.\n");
  1002. return(MEMORY_ERROR);
  1003. }
  1004. }
  1005. if((exit_status = read_samps(ibuf,dz))<0)
  1006. return(exit_status);
  1007. switch(dz->mode) {
  1008. case(0):
  1009. maxsamp[0] = 0.0;
  1010. while(dz->ssampsread > 0) {
  1011. for(n=0;n<dz->ssampsread;n++) {
  1012. if(fabs(ibuf[n]) > maxsamp[0])
  1013. maxsamp[0] = (float)fabs(ibuf[n]);
  1014. }
  1015. if((exit_status = read_samps(ibuf,dz))<0)
  1016. return(exit_status);
  1017. }
  1018. if(maxsamp[0] <= dz->param[0]) {
  1019. sprintf(errstr,"None of signal is above the input clipping level.\n");
  1020. return(DATA_ERROR);
  1021. }
  1022. gain = maxsamp[0]/dz->param[0];
  1023. if(sndseekEx(dz->ifd[0],0,0) < 0) {
  1024. sprintf(errstr,"File rewinding failed.\n");
  1025. return(DATA_ERROR);
  1026. }
  1027. if((exit_status = read_samps(ibuf,dz))<0)
  1028. return(exit_status);
  1029. while(dz->ssampsread > 0) {
  1030. for(n=0;n<dz->ssampsread;n++) {
  1031. if(ibuf[n] > dz->param[0])
  1032. ibuf[n] = (float)dz->param[0];
  1033. else if(ibuf[n] < -dz->param[0])
  1034. ibuf[n] = (float)(-dz->param[0]);
  1035. ibuf[n] = (float)(ibuf[n] * gain);
  1036. }
  1037. if((exit_status = write_samps(ibuf,dz->ssampsread,dz))<0)
  1038. return(exit_status);
  1039. if((exit_status = read_samps(ibuf,dz))<0)
  1040. return(exit_status);
  1041. }
  1042. break;
  1043. case(1):
  1044. /* TEST *
  1045. fprintf(stderr,"buflen = %d sampsread = %d ifd = %d ofd = %d ibuf = %d\n",dz->buflen,dz->ssampsread,dz->ifd[0],dz->ofd,ibuf);
  1046. * TEST */ //RWD don't want nested comments
  1047. for(n=0;n<chans;n++) {
  1048. maxsamp[n] = 0.0;
  1049. minsamp[n] = 0.0;
  1050. phase[n] = 0;
  1051. halfwavsetstart[n] = 0;
  1052. }
  1053. for(n=0;n<dz->ssampsread;n+=chans) {
  1054. for(m = 0;m < chans; m++) {
  1055. k = m + n;
  1056. switch(phase[m]) {
  1057. case(0):
  1058. if(ibuf[k] > maxsamp[m]) {
  1059. maxsamp[m] = ibuf[k];
  1060. phase[m] = 1;
  1061. } else if(ibuf[k] < minsamp[m]) {
  1062. minsamp[m] = ibuf[k];
  1063. phase[m] = -1;
  1064. }
  1065. break;
  1066. case(1):
  1067. if(ibuf[k] > 0) {
  1068. if(ibuf[k] > maxsamp[m])
  1069. maxsamp[m] = ibuf[k];
  1070. } else if(ibuf[k] < 0) {
  1071. localmax = (float)(maxsamp[m] * dz->param[0]);
  1072. for(j = halfwavsetstart[m]; j < k; j+=chans) {
  1073. if(ibuf[j] > localmax)
  1074. ibuf[j] = localmax;
  1075. }
  1076. halfwavsetstart[m] = k;
  1077. minsamp[m] = ibuf[k];
  1078. maxsamp[m] = 0;
  1079. phase[m] = -1;
  1080. }
  1081. break;
  1082. case(-1):
  1083. if(ibuf[k] < 0) {
  1084. if(ibuf[k] < minsamp[m])
  1085. minsamp[m] = ibuf[k];
  1086. } else if(ibuf[k] > 0) {
  1087. localmin = (float)(minsamp[m] * dz->param[0]);
  1088. for(j = halfwavsetstart[m]; j < k; j+=chans) {
  1089. if(ibuf[j] < localmin)
  1090. ibuf[j] = localmin;
  1091. }
  1092. halfwavsetstart[m] = k;
  1093. maxsamp[m] = ibuf[k];
  1094. minsamp[m] = 0;
  1095. phase[m] = 1;
  1096. }
  1097. break;
  1098. }
  1099. }
  1100. }
  1101. gain = 1.0/dz->param[0];
  1102. for(n = 0; n < dz->ssampsread; n++)
  1103. ibuf[n] = (float)(ibuf[n] * gain);
  1104. if((exit_status = write_samps(ibuf,dz->ssampsread,dz))<0)
  1105. return(exit_status);
  1106. break;
  1107. }
  1108. return FINISHED;
  1109. }
  1110. /****************************** GET_MODE *********************************/
  1111. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1112. {
  1113. char temp[200], *p;
  1114. if(sscanf(str,"%s",temp)!=1) {
  1115. sprintf(errstr,"Cannot read mode of program.\n");
  1116. return(USAGE_ONLY);
  1117. }
  1118. p = temp + strlen(temp) - 1;
  1119. while(p >= temp) {
  1120. if(!isdigit(*p)) {
  1121. fprintf(stderr,"Invalid mode of program entered.\n");
  1122. return(USAGE_ONLY);
  1123. }
  1124. p--;
  1125. }
  1126. if(sscanf(str,"%d",&dz->mode)!=1) {
  1127. fprintf(stderr,"Cannot read mode of program.\n");
  1128. return(USAGE_ONLY);
  1129. }
  1130. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1131. fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1132. return(USAGE_ONLY);
  1133. }
  1134. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1135. return(FINISHED);
  1136. }
  1137. /****************************** CREATE_LONG_SNDBUF *********************************/
  1138. int create_long_sndbuf(dataptr dz)
  1139. {
  1140. int n;
  1141. long bigbufsize;
  1142. dz->buflen = dz->insams[0];
  1143. bigbufsize = dz->buflen * sizeof(float);
  1144. if(bigbufsize < 0) {
  1145. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffer of the whole sound.\n");
  1146. return(PROGRAM_ERROR);
  1147. }
  1148. if((dz->bigbuf = (float *)malloc(bigbufsize)) == NULL) {
  1149. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffer for the whole sound.\n");
  1150. return(PROGRAM_ERROR);
  1151. }
  1152. for(n=0;n<dz->bufcnt;n++)
  1153. dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1154. dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1155. return(FINISHED);
  1156. }