speculation.c 40 KB

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