specfold.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283
  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 <arrays.h>
  10. #include <flags.h>
  11. #include <logic.h>
  12. #include <fmnts.h>
  13. #include <formants.h>
  14. #include <globcon.h>
  15. #include <cdpmain.h>
  16. #include <math.h>
  17. #include <mixxcon.h>
  18. #include <osbind.h>
  19. #include <standalone.h>
  20. #include <speccon.h>
  21. #include <ctype.h>
  22. #include <sfsys.h>
  23. #include <string.h>
  24. #include <srates.h>
  25. #ifdef unix
  26. #define round lround
  27. #endif
  28. #define searchsize rampbrksize
  29. char errstr[2400];
  30. int anal_infiles = 1;
  31. int sloom = 0;
  32. int sloombatch = 0;
  33. const char* cdp_version = "7.0.0";
  34. /* CDP LIBRARY FUNCTIONS TRANSFERRED HERE */
  35. static int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist);
  36. static int set_vflgs(aplptr ap,char *optflags,int optcnt,char *optlist,
  37. char *varflags,int vflagcnt, int vparamcnt,char *varlist);
  38. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  39. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  40. static int mark_parameter_types(dataptr dz,aplptr ap);
  41. static int establish_application(dataptr dz);
  42. static int application_init(dataptr dz);
  43. static int initialise_vflags(dataptr dz);
  44. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  45. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  46. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  47. static int assign_file_data_storage(int infilecnt,dataptr dz);
  48. /* CDP LIB FUNCTION MODIFIED TO AVOID CALLING setup_particular_application() */
  49. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  50. /* SIMPLIFICATION OF LIB FUNC TO APPLY TO JUST THIS FUNCTION */
  51. static int allocate_specfold_buffer(dataptr dz);
  52. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  53. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,int is_launched,dataptr dz);
  54. static int setup_the_application(dataptr dz);
  55. static int setup_the_param_ranges_and_defaults(dataptr dz);
  56. static int check_the_param_validity_and_consistency(dataptr dz);
  57. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  58. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  59. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  60. /* BYPASS LIBRARY GLOBAL FUNCTION TO GO DIRECTLY TO SPECIFIC APPLIC FUNCTIONS */
  61. static int do_specfold(dataptr dz);
  62. static void doperm(int *perm,int permlen,dataptr dz);
  63. static void hinsert(int m,int t,int *perm,int permlen);
  64. static void hprefix(int m,int *perm,int permlen);
  65. static void hshuflup(int k,int *perm,int permlen);
  66. /**************************************** MAIN *********************************************/
  67. int main(int argc,char *argv[])
  68. {
  69. int exit_status;
  70. dataptr dz = NULL;
  71. char **cmdline = argv;
  72. int cmdlinecnt = argc;
  73. aplptr ap;
  74. int is_launched = FALSE;
  75. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  76. fprintf(stdout,"%s\n",cdp_version);
  77. fflush(stdout);
  78. return 0;
  79. }
  80. /* CHECK FOR SOUNDLOOM */
  81. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  82. sloom = 0;
  83. sloombatch = 1;
  84. }
  85. if(sflinit("cdp")){
  86. sfperror("cdp: initialisation\n");
  87. return(FAILED);
  88. }
  89. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  90. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  91. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  92. return(FAILED);
  93. }
  94. if(!sloom) {
  95. if(argc == 1) {
  96. usage1();
  97. return(FAILED);
  98. } else if(argc == 2) {
  99. usage2(argv[1]);
  100. return(FAILED);
  101. }
  102. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  103. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  104. return(FAILED);
  105. }
  106. cmdline = argv;
  107. cmdlinecnt = argc;
  108. if((get_the_process_no(argv[0],dz))<0)
  109. return(FAILED);
  110. cmdline++;
  111. cmdlinecnt--;
  112. dz->maxmode = 3;
  113. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  114. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  115. return(exit_status);
  116. }
  117. cmdline++;
  118. cmdlinecnt--;
  119. if((exit_status = setup_the_application(dz))<0) {
  120. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  121. return(FAILED);
  122. }
  123. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  124. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  125. return(FAILED);
  126. }
  127. } else {
  128. //parse_TK_data() =
  129. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  130. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  131. return(exit_status);
  132. }
  133. }
  134. ap = dz->application;
  135. // parse_infile_and_hone_type() =
  136. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  137. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  138. return(FAILED);
  139. }
  140. // setup_param_ranges_and_defaults() =
  141. if((exit_status = setup_the_param_ranges_and_defaults(dz))<0) {
  142. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  143. return(FAILED);
  144. }
  145. // open_first_infile CDP LIB
  146. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  147. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  148. return(FAILED);
  149. }
  150. cmdlinecnt--;
  151. cmdline++;
  152. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,is_launched,dz))<0) {
  153. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  154. return(FAILED);
  155. }
  156. // handle_formants() redundant
  157. // handle_formant_quiksearch() redundant
  158. // handle_special_data() redundant
  159. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  160. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  161. return(FAILED);
  162. }
  163. //allocate_large_buffers() ... replaced by CDP LIB
  164. dz->extra_bufcnt = 0;
  165. dz->bptrcnt = 4;
  166. if((exit_status = establish_spec_bufptrs_and_extra_buffers(dz))<0) {
  167. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  168. return(FAILED);
  169. }
  170. if((exit_status = allocate_specfold_buffer(dz))< 0) {
  171. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  172. return(FAILED);
  173. }
  174. //check_param_validity_and_consistency .....
  175. if((exit_status = check_the_param_validity_and_consistency(dz))<0) {
  176. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  177. return(FAILED);
  178. }
  179. is_launched = TRUE;
  180. //spec_process_file =
  181. if((exit_status = do_specfold(dz))< 0) {
  182. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  183. return(FAILED);
  184. }
  185. if((exit_status = complete_output(dz))<0) { // CDP LIB
  186. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  187. return(FAILED);
  188. }
  189. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  190. free(dz);
  191. return(SUCCEEDED);
  192. }
  193. /**********************************************
  194. REPLACED CDP LIB FUNCTIONS
  195. **********************************************/
  196. /****************************** SET_PARAM_DATA *********************************/
  197. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  198. {
  199. ap->special_data = (char)special_data;
  200. ap->param_cnt = (char)paramcnt;
  201. ap->max_param_cnt = (char)maxparamcnt;
  202. if(ap->max_param_cnt>0) {
  203. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  204. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  205. return(MEMORY_ERROR);
  206. }
  207. strcpy(ap->param_list,paramlist);
  208. }
  209. return(FINISHED);
  210. }
  211. /****************************** SET_VFLGS *********************************/
  212. int set_vflgs
  213. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  214. {
  215. ap->option_cnt = (char) optcnt; /*RWD added cast */
  216. if(optcnt) {
  217. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  218. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  219. return(MEMORY_ERROR);
  220. }
  221. strcpy(ap->option_list,optlist);
  222. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  223. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  224. return(MEMORY_ERROR);
  225. }
  226. strcpy(ap->option_flags,optflags);
  227. }
  228. ap->vflag_cnt = (char) vflagcnt;
  229. ap->variant_param_cnt = (char) vparamcnt;
  230. if(vflagcnt) {
  231. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  232. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  233. return(MEMORY_ERROR);
  234. }
  235. strcpy(ap->variant_list,varlist);
  236. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  237. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  238. return(MEMORY_ERROR);
  239. }
  240. strcpy(ap->variant_flags,varflags);
  241. }
  242. return(FINISHED);
  243. }
  244. /***************************** APPLICATION_INIT **************************/
  245. int application_init(dataptr dz)
  246. {
  247. int exit_status;
  248. int storage_cnt;
  249. int tipc, brkcnt;
  250. aplptr ap = dz->application;
  251. if(ap->vflag_cnt>0)
  252. initialise_vflags(dz);
  253. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  254. ap->total_input_param_cnt = (char)tipc;
  255. if(tipc>0) {
  256. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  257. return(exit_status);
  258. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  259. return(exit_status);
  260. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  261. return(exit_status);
  262. }
  263. brkcnt = tipc;
  264. if(brkcnt>0) {
  265. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  266. return(exit_status);
  267. }
  268. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  269. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  270. return(exit_status);
  271. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  272. return(exit_status);
  273. }
  274. if((exit_status = mark_parameter_types(dz,ap))<0)
  275. return(exit_status);
  276. // establish_infile_constants() replaced by
  277. dz->infilecnt = 1;
  278. //establish_bufptrs_and_extra_buffers():
  279. return FINISHED;
  280. }
  281. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  282. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  283. {
  284. int n;
  285. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  286. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  287. return(MEMORY_ERROR);
  288. }
  289. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  290. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  291. return(MEMORY_ERROR);
  292. }
  293. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  294. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  295. return(MEMORY_ERROR);
  296. }
  297. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  298. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  299. return(MEMORY_ERROR);
  300. }
  301. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  302. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  303. return(MEMORY_ERROR);
  304. }
  305. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  306. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  307. return(MEMORY_ERROR);
  308. }
  309. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  310. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  311. return(MEMORY_ERROR);
  312. }
  313. for(n=0;n<brkcnt;n++) {
  314. dz->brk[n] = NULL;
  315. dz->brkptr[n] = NULL;
  316. dz->brkinit[n] = 0;
  317. dz->brksize[n] = 0;
  318. }
  319. return(FINISHED);
  320. }
  321. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  322. /* RWD mallo changed to calloc; helps debug verison run as release! */
  323. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  324. {
  325. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  326. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  327. return(MEMORY_ERROR);
  328. }
  329. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  330. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  331. return(MEMORY_ERROR);
  332. }
  333. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  334. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  335. return(MEMORY_ERROR);
  336. }
  337. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  338. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  339. return(MEMORY_ERROR);
  340. }
  341. return(FINISHED);
  342. }
  343. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  344. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  345. {
  346. int n;
  347. for(n=0;n<storage_cnt;n++) {
  348. dz->is_int[n] = (char)0;
  349. dz->no_brk[n] = (char)0;
  350. }
  351. return(FINISHED);
  352. }
  353. /***************************** MARK_PARAMETER_TYPES **************************/
  354. int mark_parameter_types(dataptr dz,aplptr ap)
  355. {
  356. int n, m; /* PARAMS */
  357. for(n=0;n<ap->max_param_cnt;n++) {
  358. switch(ap->param_list[n]) {
  359. case('0'): break; /* dz->is_active[n] = 0 is default */
  360. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  361. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  362. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  363. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  364. default:
  365. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  366. return(PROGRAM_ERROR);
  367. }
  368. } /* OPTIONS */
  369. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  370. switch(ap->option_list[n]) {
  371. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  372. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  373. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  374. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  375. default:
  376. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  377. return(PROGRAM_ERROR);
  378. }
  379. } /* VARIANTS */
  380. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  381. switch(ap->variant_list[n]) {
  382. case('0'): break;
  383. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  384. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  385. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  386. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  387. default:
  388. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  389. return(PROGRAM_ERROR);
  390. }
  391. } /* INTERNAL */
  392. for(n=0,
  393. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  394. switch(ap->internal_param_list[n]) {
  395. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  396. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  397. case('d'): dz->no_brk[m] = (char)1; break;
  398. default:
  399. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  400. return(PROGRAM_ERROR);
  401. }
  402. }
  403. return(FINISHED);
  404. }
  405. /***************************** HANDLE_THE_OUTFILE **************************/
  406. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,int is_launched,dataptr dz)
  407. {
  408. int exit_status;
  409. char *filename = NULL;
  410. filename = (*cmdline)[0];
  411. strcpy(dz->outfilename,filename);
  412. if((exit_status = create_sized_outfile(filename,dz))<0)
  413. return(exit_status);
  414. (*cmdline)++;
  415. (*cmdlinecnt)--;
  416. return(FINISHED);
  417. }
  418. /***************************** ESTABLISH_APPLICATION **************************/
  419. int establish_application(dataptr dz)
  420. {
  421. aplptr ap;
  422. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  423. sprintf(errstr,"establish_application()\n");
  424. return(MEMORY_ERROR);
  425. }
  426. ap = dz->application;
  427. memset((char *)ap,0,sizeof(struct applic));
  428. return(FINISHED);
  429. }
  430. /************************* INITIALISE_VFLAGS *************************/
  431. int initialise_vflags(dataptr dz)
  432. {
  433. int n;
  434. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  435. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  436. return(MEMORY_ERROR);
  437. }
  438. for(n=0;n<dz->application->vflag_cnt;n++)
  439. dz->vflag[n] = FALSE;
  440. return FINISHED;
  441. }
  442. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  443. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  444. {
  445. int n;
  446. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  447. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  448. return(MEMORY_ERROR);
  449. }
  450. for(n=0;n<tipc;n++)
  451. ap->default_val[n] = 0.0;
  452. return(FINISHED);
  453. }
  454. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  455. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  456. {
  457. int n;
  458. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  459. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  460. return(MEMORY_ERROR);
  461. }
  462. for(n=0;n<tipc;n++)
  463. dz->is_active[n] = (char)0;
  464. return(FINISHED);
  465. }
  466. /************************* SETUP_THE_APPLICATION *******************/
  467. int setup_the_application(dataptr dz)
  468. {
  469. int exit_status;
  470. aplptr ap;
  471. if((exit_status = establish_application(dz))<0) // GLOBAL
  472. return(FAILED);
  473. ap = dz->application;
  474. // SEE parstruct FOR EXPLANATION of next 2 functions
  475. switch(dz->mode) {
  476. case(0): //fall thro
  477. case(2): exit_status = set_param_data(ap,0,3,3,"iii"); break;
  478. case(1): exit_status = set_param_data(ap,0,3,2,"ii0"); break;
  479. }
  480. if(exit_status < 0)
  481. return(FAILED);
  482. if((exit_status = set_vflgs(ap,"",0,"","a",1,0,"0"))<0)
  483. return(FAILED);
  484. // set_legal_infile_structure -->
  485. dz->has_otherfile = FALSE;
  486. // assign_process_logic -->
  487. dz->input_data_type = ANALFILE_ONLY;
  488. dz->process_type = EQUAL_ANALFILE;
  489. dz->outfiletype = ANALFILE_OUT;
  490. dz->maxmode = 3;
  491. return application_init(dz); //GLOBAL
  492. }
  493. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  494. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  495. {
  496. int exit_status;
  497. infileptr infile_info;
  498. if(!sloom) {
  499. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  500. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  501. return(MEMORY_ERROR);
  502. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  503. sprintf(errstr,"Failed tp parse input file %s\n",cmdline[0]);
  504. return(PROGRAM_ERROR);
  505. } else if(infile_info->filetype != ANALFILE) {
  506. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  507. return(DATA_ERROR);
  508. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  509. sprintf(errstr,"Failed to copy file parsing information\n");
  510. return(PROGRAM_ERROR);
  511. }
  512. free(infile_info);
  513. }
  514. dz->clength = dz->wanted / 2;
  515. dz->chwidth = dz->nyquist/(double)(dz->clength-1);
  516. dz->halfchwidth = dz->chwidth/2.0;
  517. return(FINISHED);
  518. }
  519. /************************* SETUP_THE_PARAM_RANGES_AND_DEFAULTS *******************/
  520. int setup_the_param_ranges_and_defaults(dataptr dz)
  521. {
  522. int exit_status;
  523. aplptr ap = dz->application;
  524. // set_param_ranges()
  525. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  526. // NB total_input_param_cnt is > 0 !!!s
  527. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  528. return(FAILED);
  529. // get_param_ranges()
  530. ap->lo[0] = 1;
  531. ap->hi[0] = dz->clength - 4;
  532. ap->default_val[0] = 0;
  533. ap->lo[1] = 4;
  534. ap->hi[1] = dz->clength;
  535. ap->default_val[1] = dz->clength/2;
  536. switch(dz->mode) {
  537. case(0):
  538. ap->lo[2] = 1;
  539. ap->hi[2] = dz->clength;
  540. ap->default_val[2] = 1;
  541. break;
  542. case(2):
  543. ap->lo[2] = 1;
  544. ap->hi[2] = 64;
  545. ap->default_val[2] = 1;
  546. break;
  547. }
  548. dz->maxmode = 3;
  549. if(!sloom)
  550. put_default_vals_in_all_params(dz);
  551. return(FINISHED);
  552. }
  553. /********************************* PARSE_SLOOM_DATA *********************************/
  554. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  555. {
  556. int exit_status;
  557. int cnt = 1, infilecnt;
  558. int filesize, insams, inbrksize;
  559. double dummy;
  560. int true_cnt = 0;
  561. aplptr ap;
  562. while(cnt<=PRE_CMDLINE_DATACNT) {
  563. if(cnt > argc) {
  564. sprintf(errstr,"Insufficient data sent from TK\n");
  565. return(DATA_ERROR);
  566. }
  567. switch(cnt) {
  568. case(1):
  569. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  570. sprintf(errstr,"Cannot read process no. sent from TK\n");
  571. return(DATA_ERROR);
  572. }
  573. break;
  574. case(2):
  575. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  576. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  577. return(DATA_ERROR);
  578. }
  579. if(dz->mode > 0)
  580. dz->mode--;
  581. //setup_particular_application() =
  582. if((exit_status = setup_the_application(dz))<0)
  583. return(exit_status);
  584. ap = dz->application;
  585. break;
  586. case(3):
  587. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  588. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  589. return(DATA_ERROR);
  590. }
  591. if(infilecnt < 1) {
  592. true_cnt = cnt + 1;
  593. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  594. }
  595. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  596. return(exit_status);
  597. break;
  598. case(INPUT_FILETYPE+4):
  599. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  600. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  601. return(DATA_ERROR);
  602. }
  603. break;
  604. case(INPUT_FILESIZE+4):
  605. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  606. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  607. return(DATA_ERROR);
  608. }
  609. dz->insams[0] = filesize;
  610. break;
  611. case(INPUT_INSAMS+4):
  612. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  613. sprintf(errstr,"Cannot read insams sent from TK\n");
  614. return(DATA_ERROR);
  615. }
  616. dz->insams[0] = insams;
  617. break;
  618. case(INPUT_SRATE+4):
  619. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  620. sprintf(errstr,"Cannot read srate sent from TK\n");
  621. return(DATA_ERROR);
  622. }
  623. break;
  624. case(INPUT_CHANNELS+4):
  625. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  626. sprintf(errstr,"Cannot read channels sent from TK\n");
  627. return(DATA_ERROR);
  628. }
  629. break;
  630. case(INPUT_STYPE+4):
  631. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  632. sprintf(errstr,"Cannot read stype sent from TK\n");
  633. return(DATA_ERROR);
  634. }
  635. break;
  636. case(INPUT_ORIGSTYPE+4):
  637. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  638. sprintf(errstr,"Cannot read origstype sent from TK\n");
  639. return(DATA_ERROR);
  640. }
  641. break;
  642. case(INPUT_ORIGRATE+4):
  643. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  644. sprintf(errstr,"Cannot read origrate sent from TK\n");
  645. return(DATA_ERROR);
  646. }
  647. break;
  648. case(INPUT_MLEN+4):
  649. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  650. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  651. return(DATA_ERROR);
  652. }
  653. break;
  654. case(INPUT_DFAC+4):
  655. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  656. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  657. return(DATA_ERROR);
  658. }
  659. break;
  660. case(INPUT_ORIGCHANS+4):
  661. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  662. sprintf(errstr,"Cannot read origchans sent from TK\n");
  663. return(DATA_ERROR);
  664. }
  665. break;
  666. case(INPUT_SPECENVCNT+4):
  667. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  668. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  669. return(DATA_ERROR);
  670. }
  671. dz->specenvcnt = dz->infile->specenvcnt;
  672. break;
  673. case(INPUT_WANTED+4):
  674. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  675. sprintf(errstr,"Cannot read wanted sent from TK\n");
  676. return(DATA_ERROR);
  677. }
  678. break;
  679. case(INPUT_WLENGTH+4):
  680. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  681. sprintf(errstr,"Cannot read wlength sent from TK\n");
  682. return(DATA_ERROR);
  683. }
  684. break;
  685. case(INPUT_OUT_CHANS+4):
  686. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  687. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  688. return(DATA_ERROR);
  689. }
  690. break;
  691. /* RWD these chanegs to samps - tk will have to deal with that! */
  692. case(INPUT_DESCRIPTOR_BYTES+4):
  693. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  694. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  695. return(DATA_ERROR);
  696. }
  697. break;
  698. case(INPUT_IS_TRANSPOS+4):
  699. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  700. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  701. return(DATA_ERROR);
  702. }
  703. break;
  704. case(INPUT_COULD_BE_TRANSPOS+4):
  705. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  706. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  707. return(DATA_ERROR);
  708. }
  709. break;
  710. case(INPUT_COULD_BE_PITCH+4):
  711. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  712. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  713. return(DATA_ERROR);
  714. }
  715. break;
  716. case(INPUT_DIFFERENT_SRATES+4):
  717. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  718. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  719. return(DATA_ERROR);
  720. }
  721. break;
  722. case(INPUT_DUPLICATE_SNDS+4):
  723. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  724. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  725. return(DATA_ERROR);
  726. }
  727. break;
  728. case(INPUT_BRKSIZE+4):
  729. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  730. sprintf(errstr,"Cannot read brksize sent from TK\n");
  731. return(DATA_ERROR);
  732. }
  733. if(inbrksize > 0) {
  734. switch(dz->input_data_type) {
  735. case(WORDLIST_ONLY):
  736. break;
  737. case(PITCH_AND_PITCH):
  738. case(PITCH_AND_TRANSPOS):
  739. case(TRANSPOS_AND_TRANSPOS):
  740. dz->tempsize = inbrksize;
  741. break;
  742. case(BRKFILES_ONLY):
  743. case(UNRANGED_BRKFILE_ONLY):
  744. case(DB_BRKFILES_ONLY):
  745. case(ALL_FILES):
  746. case(ANY_NUMBER_OF_ANY_FILES):
  747. if(dz->extrabrkno < 0) {
  748. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  749. return(DATA_ERROR);
  750. }
  751. if(dz->brksize == NULL) {
  752. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  753. return(PROGRAM_ERROR);
  754. }
  755. dz->brksize[dz->extrabrkno] = inbrksize;
  756. break;
  757. default:
  758. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  759. dz->input_data_type);
  760. return(PROGRAM_ERROR);
  761. }
  762. break;
  763. }
  764. break;
  765. case(INPUT_NUMSIZE+4):
  766. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  767. sprintf(errstr,"Cannot read numsize sent from TK\n");
  768. return(DATA_ERROR);
  769. }
  770. break;
  771. case(INPUT_LINECNT+4):
  772. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  773. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  774. return(DATA_ERROR);
  775. }
  776. break;
  777. case(INPUT_ALL_WORDS+4):
  778. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  779. sprintf(errstr,"Cannot read all_words sent from TK\n");
  780. return(DATA_ERROR);
  781. }
  782. break;
  783. case(INPUT_ARATE+4):
  784. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  785. sprintf(errstr,"Cannot read arate sent from TK\n");
  786. return(DATA_ERROR);
  787. }
  788. break;
  789. case(INPUT_FRAMETIME+4):
  790. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  791. sprintf(errstr,"Cannot read frametime sent from TK\n");
  792. return(DATA_ERROR);
  793. }
  794. dz->frametime = (float)dummy;
  795. break;
  796. case(INPUT_WINDOW_SIZE+4):
  797. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  798. sprintf(errstr,"Cannot read window_size sent from TK\n");
  799. return(DATA_ERROR);
  800. }
  801. break;
  802. case(INPUT_NYQUIST+4):
  803. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  804. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  805. return(DATA_ERROR);
  806. }
  807. break;
  808. case(INPUT_DURATION+4):
  809. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  810. sprintf(errstr,"Cannot read duration sent from TK\n");
  811. return(DATA_ERROR);
  812. }
  813. break;
  814. case(INPUT_MINBRK+4):
  815. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  816. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  817. return(DATA_ERROR);
  818. }
  819. break;
  820. case(INPUT_MAXBRK+4):
  821. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  822. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  823. return(DATA_ERROR);
  824. }
  825. break;
  826. case(INPUT_MINNUM+4):
  827. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  828. sprintf(errstr,"Cannot read minnum sent from TK\n");
  829. return(DATA_ERROR);
  830. }
  831. break;
  832. case(INPUT_MAXNUM+4):
  833. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  834. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  835. return(DATA_ERROR);
  836. }
  837. break;
  838. default:
  839. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  840. return(PROGRAM_ERROR);
  841. }
  842. cnt++;
  843. }
  844. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  845. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  846. return(DATA_ERROR);
  847. }
  848. if(true_cnt)
  849. cnt = true_cnt;
  850. *cmdlinecnt = 0;
  851. while(cnt < argc) {
  852. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  853. return(exit_status);
  854. cnt++;
  855. }
  856. return(FINISHED);
  857. }
  858. /********************************* GET_TK_CMDLINE_WORD *********************************/
  859. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  860. {
  861. if(*cmdlinecnt==0) {
  862. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  863. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  864. return(MEMORY_ERROR);
  865. }
  866. } else {
  867. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  868. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  869. return(MEMORY_ERROR);
  870. }
  871. }
  872. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  873. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  874. return(MEMORY_ERROR);
  875. }
  876. strcpy((*cmdline)[*cmdlinecnt],q);
  877. (*cmdlinecnt)++;
  878. return(FINISHED);
  879. }
  880. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  881. int assign_file_data_storage(int infilecnt,dataptr dz)
  882. {
  883. int exit_status;
  884. int no_sndfile_system_files = FALSE;
  885. dz->infilecnt = infilecnt;
  886. if((exit_status = allocate_filespace(dz))<0)
  887. return(exit_status);
  888. if(no_sndfile_system_files)
  889. dz->infilecnt = 0;
  890. return(FINISHED);
  891. }
  892. /*********************** CHECK_THE_PARAM_VALIDITY_AND_CONSISTENCY *********************/
  893. int check_the_param_validity_and_consistency(dataptr dz)
  894. {
  895. int n, i, j, k, m;
  896. int chan_offset, chans_to_process, half_fold, no_of_folds;
  897. float *chancentre = dz->flbufptr[2];
  898. dz->iparam[0]--; // Change from 1-N to 0-(N-1) counting-range
  899. if(dz->iparam[0] + dz->iparam[1] > dz->clength) {
  900. sprintf(errstr,"Top channel to modify (%d) beyond top of spectrum (%d)\n",dz->iparam[0] + dz->iparam[1],dz->clength - 1);
  901. return(DATA_ERROR);
  902. }
  903. if(dz->mode==0) {
  904. if(ODD(dz->iparam[1])) {
  905. sprintf(errstr,"number of channels to fold must be even.\n");
  906. return(DATA_ERROR);
  907. }
  908. if(dz->iparam[2] >= dz->iparam[1]) {
  909. sprintf(errstr,"Folding is greater than number of channels to fold.\n");
  910. return(DATA_ERROR);
  911. }
  912. }
  913. if((dz->iparray = (int **)malloc(2 * sizeof(int *)))==NULL) {
  914. sprintf(errstr,"INSUFFICIENT MEMORY for internal integer arrays.\n");
  915. return(MEMORY_ERROR);
  916. }
  917. if((dz->iparray[0] = (int *)malloc(dz->clength * sizeof(int)))==NULL) {
  918. sprintf(errstr,"INSUFFICIENT MEMORY for internal integer array 1.\n");
  919. return(MEMORY_ERROR);
  920. }
  921. if((dz->iparray[1] = (int *)malloc(dz->clength * sizeof(int)))==NULL) {
  922. sprintf(errstr,"INSUFFICIENT MEMORY for internal integer array 2.\n");
  923. return(MEMORY_ERROR);
  924. }
  925. chan_offset = dz->iparam[0];
  926. chans_to_process = dz->iparam[1];
  927. for(n=0;n<dz->clength;n++) { // Copy in all chan-nos (no perm)
  928. dz->iparray[0][n] = n; // and record centre-frq of all channels
  929. chancentre[n] = (float)(dz->chwidth * n);
  930. }
  931. switch(dz->mode) {
  932. case(0): // FOLD
  933. half_fold = chans_to_process/2;
  934. no_of_folds = dz->iparam[2];
  935. for(n=0;n<chans_to_process;n++) // Original foldable channels in order
  936. dz->iparray[0][chan_offset + n] = chan_offset + n;
  937. k = 0;
  938. j = 1; // Label the 2 arrays
  939. for(i = 0; i < no_of_folds;i++) {
  940. n = 0;
  941. m = 1;
  942. while(n < half_fold) { // Copy first half of channels, to alternate channels
  943. dz->iparray[j][chan_offset + m] = dz->iparray[k][chan_offset + n++];
  944. m += 2;
  945. }
  946. m = chans_to_process - 2; // Copy second half of channels, to alternate channels, reading downwards
  947. while(n < chans_to_process) {
  948. dz->iparray[j][chan_offset + m] = dz->iparray[k][chan_offset + n++];
  949. m -= 2;
  950. }
  951. if(k==1) { // Swap arrays
  952. k = 0;
  953. j = 1;
  954. } else {
  955. k = 1;
  956. j = 0;
  957. }
  958. }
  959. if(ODD(no_of_folds)) { // Ensure the result ends up in array[0]
  960. for(n=0;n<chans_to_process;n++)
  961. dz->iparray[0][chan_offset + n] = dz->iparray[1][chan_offset + n];
  962. }
  963. break;
  964. case(1): // INVERT
  965. for(n=0,m = chans_to_process-1;n<chans_to_process;n++,m--) // Invert selected channels
  966. dz->iparray[0][chan_offset + n] = chan_offset + m;
  967. break;
  968. case(2): // RANDOMISE
  969. srand((int)dz->iparam[2]); // Initialise random generator
  970. for(n=0;n<chans_to_process;n++) // Copy in all values (no perm)
  971. dz->iparray[0][n] = n; // Perm the appropriate range of values
  972. doperm(dz->iparray[1],chans_to_process,dz);
  973. for(n=0;n<chans_to_process;n++) // Copy to the to-be-permd channels, the permd_values (suitably offset)
  974. dz->iparray[0][n + chan_offset] = dz->iparray[1][n] + chan_offset;
  975. break;
  976. }
  977. return FINISHED;
  978. }
  979. /************************* redundant functions: to ensure libs compile OK *******************/
  980. int assign_process_logic(dataptr dz)
  981. {
  982. return(FINISHED);
  983. }
  984. void set_legal_infile_structure(dataptr dz)
  985. {}
  986. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  987. {
  988. return(FINISHED);
  989. }
  990. int setup_internal_arrays_and_array_pointers(dataptr dz)
  991. {
  992. return(FINISHED);
  993. }
  994. int establish_bufptrs_and_extra_buffers(dataptr dz)
  995. {
  996. return(FINISHED);
  997. }
  998. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  999. {
  1000. return(FINISHED);
  1001. }
  1002. int read_special_data(char *str,dataptr dz)
  1003. {
  1004. return(FINISHED);
  1005. }
  1006. int inner_loop
  1007. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1008. {
  1009. return(FINISHED);
  1010. }
  1011. /********************************************************************************************/
  1012. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1013. {
  1014. if (!strcmp(prog_identifier_from_cmdline,"specfold")) dz->process = SPECFOLD;
  1015. else {
  1016. fprintf(stderr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1017. return(USAGE_ONLY);
  1018. }
  1019. return(FINISHED);
  1020. }
  1021. /******************************** USAGE1 ********************************/
  1022. int usage1(void)
  1023. {
  1024. return usage2("specfold");
  1025. }
  1026. /******************************** USAGE2 ********************************/
  1027. int usage2(char *str)
  1028. {
  1029. if(!strcmp(str,"specfold")) {
  1030. fprintf(stdout,
  1031. "USAGE: specfold specfold 1 inanalfile outanalfile stt len cnt [-a]\n"
  1032. "USAGE: specfold specfold 2 inanalfile outanalfile stt len [-a]\n"
  1033. "USAGE: specfold specfold 3 inanalfile outanalfile stt len seed [-a]\n"
  1034. "\n"
  1035. "MODE 1 : Fold the spectrum.\n"
  1036. "\n"
  1037. "Channels in fold group are split into 2 equal sets of consective channels.\n"
  1038. "Values in first set are moved from channel N to channel 2N\n"
  1039. "Values in 2nd set are assigned to remaining channels, in descending order.\n"
  1040. "\n"
  1041. "MODE 2 : Invert the spectrum.\n"
  1042. "MODE 2 : Randomise the spectrum.\n"
  1043. "\n"
  1044. "STT Lowest spectrum channel to process.\n"
  1045. "LEN Number of channels to process (>= 4)\n"
  1046. " For Folding (Mode 1) this must be an even number.\n"
  1047. "CNT (Mode 1) Number of folds (less than \"len\").\n"
  1048. "SEED (Mode 3) Seed value sets a specific random perm of channels.\n"
  1049. "-a Process the amplitudes only.\n");
  1050. } else
  1051. fprintf(stdout,"Unknown option '%s'\n",str);
  1052. return(USAGE_ONLY);
  1053. }
  1054. int usage3(char *str1,char *str2)
  1055. {
  1056. fprintf(stderr,"Insufficient parameters on command line.\n");
  1057. return(USAGE_ONLY);
  1058. }
  1059. /**************************** DO_SPECFOLD ****************************/
  1060. int do_specfold(dataptr dz)
  1061. {
  1062. int exit_status, wc, windows_in_buf, cc, vc, newcc, newvc, chans_to_fold = dz->iparam[1], chan_offset = dz->iparam[0];
  1063. int chantop = chan_offset + chans_to_fold;
  1064. int *perm = dz->iparray[0];
  1065. float *newspec = dz->flbufptr[1], *chancentre = dz->flbufptr[1];
  1066. double frqoffset, newfrq;
  1067. int samps_read;
  1068. while((samps_read = fgetfbufEx(dz->bigfbuf, dz->buflen,dz->ifd[0],0)) > 0) {
  1069. if(samps_read < 0) {
  1070. sprintf(errstr,"Failed to read data from input file.\n");
  1071. return(SYSTEM_ERROR);
  1072. }
  1073. dz->flbufptr[0] = dz->bigfbuf;
  1074. windows_in_buf = samps_read/dz->wanted;
  1075. for(wc=0; wc<windows_in_buf; wc++, dz->total_windows++) {
  1076. for(cc=chan_offset,vc=chan_offset*2;cc < chantop;cc++,vc += 2) { // Fold spectrum into newspec
  1077. newcc = perm[cc];
  1078. newvc = newcc * 2; // Index of amplitude
  1079. if(dz->vflag[0]) {
  1080. frqoffset = dz->flbufptr[0][FREQ] - chancentre[cc];
  1081. newfrq = (float)(chancentre[newcc] + frqoffset);
  1082. if(newfrq >= dz->nyquist) { // Fold any nyquist overflow around 0
  1083. newfrq -= dz->nyquist;
  1084. newvc = 0;
  1085. }
  1086. newspec[newvc++] = dz->flbufptr[0][AMPP];
  1087. newspec[newvc] = (float)newfrq;
  1088. } else
  1089. newspec[newvc] = dz->flbufptr[0][AMPP];
  1090. }
  1091. for(cc=chan_offset,vc=vc=chan_offset*2;cc < chantop;cc++,vc += 2) { // Copy newspec back into orig
  1092. dz->flbufptr[0][AMPP] = newspec[AMPP];
  1093. if(dz->vflag[0])
  1094. dz->flbufptr[0][FREQ] = newspec[FREQ];
  1095. }
  1096. dz->flbufptr[0] += dz->wanted;
  1097. }
  1098. if((exit_status = write_samps(dz->bigfbuf,windows_in_buf * dz->wanted,dz))<0)
  1099. return(exit_status);
  1100. }
  1101. return FINISHED;
  1102. }
  1103. /**************************** ALLOCATE_SPECFOLD_BUFFER ******************************/
  1104. //TW REVISED: buffers no longer multiples of secsize
  1105. int allocate_specfold_buffer(dataptr dz)
  1106. {
  1107. // int bigbufsize;
  1108. // int exit_status;
  1109. unsigned int buffersize;
  1110. if(dz->bptrcnt <= 0) {
  1111. sprintf(errstr,"bufptr not established in allocate_single_buffer()\n");
  1112. return(PROGRAM_ERROR);
  1113. }
  1114. buffersize = (dz->wanted) * BUF_MULTIPLIER;
  1115. dz->buflen = buffersize;
  1116. buffersize += 2 * dz->wanted; //Calculation buffer
  1117. if((dz->bigfbuf = (float*) malloc(buffersize * sizeof(float)))==NULL) {
  1118. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  1119. return(MEMORY_ERROR);
  1120. }
  1121. dz->big_fsize = dz->buflen;
  1122. dz->flbufptr[1] = dz->bigfbuf + dz->big_fsize;
  1123. dz->flbufptr[2] = dz->flbufptr[1] + dz->wanted;
  1124. dz->flbufptr[3] = dz->flbufptr[2] + dz->wanted;
  1125. return(FINISHED);
  1126. }
  1127. /********************************** DOPERM etc *******************************/
  1128. void doperm(int *perm,int permlen,dataptr dz)
  1129. {
  1130. int n, t;
  1131. for(n=0;n<permlen;n++) {
  1132. t = (int)floor(drand48() * (n+1));
  1133. if(t==n) {
  1134. hprefix(n,perm,permlen);
  1135. } else {
  1136. hinsert(n,t,perm,permlen);
  1137. }
  1138. }
  1139. }
  1140. void hinsert(int m,int t,int *perm,int permlen)
  1141. {
  1142. hshuflup(t+1,perm,permlen);
  1143. perm[t+1] = m;
  1144. }
  1145. void hprefix(int m,int *perm,int permlen)
  1146. {
  1147. hshuflup(0,perm,permlen);
  1148. perm[0] = m;
  1149. }
  1150. void hshuflup(int k,int *perm,int permlen)
  1151. {
  1152. int n, *i;
  1153. int z = permlen - 1;
  1154. i = perm+z;
  1155. for(n = z;n > k;n--) {
  1156. *i = *(i-1);
  1157. i--;
  1158. }
  1159. }
  1160. /****************************** GET_MODE *********************************/
  1161. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1162. {
  1163. char temp[200], *p;
  1164. if(sscanf(str,"%s",temp)!=1) {
  1165. sprintf(errstr,"Cannot read mode of program.\n");
  1166. return(USAGE_ONLY);
  1167. }
  1168. p = temp + strlen(temp) - 1;
  1169. while(p >= temp) {
  1170. if(!isdigit(*p)) {
  1171. fprintf(stderr,"Invalid mode of program entered.\n");
  1172. return(USAGE_ONLY);
  1173. }
  1174. p--;
  1175. }
  1176. if(sscanf(str,"%d",&dz->mode)!=1) {
  1177. fprintf(stderr,"Cannot read mode of program.\n");
  1178. return(USAGE_ONLY);
  1179. }
  1180. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1181. fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1182. return(USAGE_ONLY);
  1183. }
  1184. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1185. return(FINISHED);
  1186. }