specenv.c 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373
  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(x) lround((x))
  23. #else
  24. #define round(x) cdp_round((x))
  25. #endif
  26. char errstr[2400];
  27. int anal_infiles = 1;
  28. int sloom = 0;
  29. int sloombatch = 0;
  30. #define SE_IBUF1 0
  31. #define SE_IBUF2 1
  32. #define SE_OBUF 2
  33. #define SE_BUFEND 3
  34. #define CHAN_SRCHRANGE_F (4)
  35. #define spececentrfrq specenvpch
  36. #define MINSPECAMP
  37. const char* cdp_version = "7.1.0";
  38. /* CDP LIBRARY FUNCTIONS TRANSFERRED HERE */
  39. static int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist);
  40. static int set_vflgs(aplptr ap,char *optflags,int optcnt,char *optlist,
  41. char *varflags,int vflagcnt, int vparamcnt,char *varlist);
  42. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  43. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  44. static int mark_parameter_types(dataptr dz,aplptr ap);
  45. static int establish_application(dataptr dz);
  46. static int application_init(dataptr dz);
  47. static int initialise_vflags(dataptr dz);
  48. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  49. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  50. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  51. static int assign_file_data_storage(int infilecnt,dataptr dz);
  52. /* CDP LIB FUNCTION MODIFIED TO AVOID CALLING setup_particular_application() */
  53. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  54. /* SIMPLIFICATION OF LIB FUNC TO APPLY TO JUST THIS FUNCTION */
  55. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  56. static int handle_the_extra_infile(char ***cmdline,int *cmdlinecnt,dataptr dz);
  57. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,int is_launched,dataptr dz);
  58. static int setup_specenv_application(dataptr dz);
  59. static int setup_specenv_param_ranges_and_defaults(dataptr dz);
  60. static int check_specenv_param_validity_and_consistency(dataptr dz);
  61. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  62. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  63. /* BYPASS LIBRARY GLOBAL FUNCTION TO GO DIRECTLY TO SPECIFIC APPLIC FUNCTIONS */
  64. static int do_specenv(dataptr dz);
  65. static int allocate_specenv_buffer(dataptr dz);
  66. /**************************************** MAIN *********************************************/
  67. int main(int argc,char *argv[])
  68. {
  69. int exit_status;
  70. dataptr dz = NULL;
  71. char **cmdline;
  72. int cmdlinecnt;
  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. // setup_particular_application =
  113. if((exit_status = setup_specenv_application(dz))<0) {
  114. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  115. return(FAILED);
  116. }
  117. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  118. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  119. return(FAILED);
  120. }
  121. } else {
  122. //parse_TK_data() =
  123. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  124. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  125. return(exit_status);
  126. }
  127. }
  128. ap = dz->application;
  129. // parse_infile_and_hone_type() =
  130. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  131. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  132. return(FAILED);
  133. }
  134. // setup_param_ranges_and_defaults() =
  135. if((exit_status = setup_specenv_param_ranges_and_defaults(dz))<0) {
  136. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  137. return(FAILED);
  138. }
  139. // open_first_infile CDP LIB
  140. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  141. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  142. return(FAILED);
  143. }
  144. cmdlinecnt--;
  145. cmdline++;
  146. // handle_extra_infiles() =
  147. if((exit_status = handle_the_extra_infile(&cmdline,&cmdlinecnt,dz))<0) {
  148. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  149. return(FAILED);
  150. }
  151. // handle_outfile() =
  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. //check_param_validity_and_consistency .....
  164. if((exit_status = check_specenv_param_validity_and_consistency(dz))<0) {
  165. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  166. return(FAILED);
  167. }
  168. is_launched = TRUE;
  169. //allocate_large_buffers() ... replaced by
  170. dz->extra_bufcnt = 0;
  171. dz->bptrcnt = 3;
  172. if((exit_status = establish_spec_bufptrs_and_extra_buffers(dz))<0) {
  173. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  174. return(FAILED);
  175. }
  176. if((exit_status = allocate_specenv_buffer(dz))<0) {
  177. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  178. return(FAILED);
  179. }
  180. //param_preprocess() redundant
  181. //spec_process_file =
  182. if((exit_status = do_specenv(dz))<0) {
  183. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  184. return(FAILED);
  185. }
  186. if((exit_status = complete_output(dz))<0) { // CDP LIB
  187. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  188. return(FAILED);
  189. }
  190. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  191. free(dz);
  192. return(SUCCEEDED);
  193. }
  194. /**********************************************
  195. REPLACED CDP LIB FUNCTIONS
  196. **********************************************/
  197. /************************ HANDLE_THE_EXTRA_INFILE *********************/
  198. int handle_the_extra_infile(char ***cmdline,int *cmdlinecnt,dataptr dz)
  199. {
  200. /* OPEN ONE EXTRA ANALFILE, CHECK COMPATIBILITY */
  201. int exit_status;
  202. char *filename;
  203. fileptr fp2;
  204. int fileno = 1;
  205. double maxamp, maxloc;
  206. int maxrep;
  207. int getmax = 0, getmaxinfo = 0;
  208. infileptr ifp;
  209. fileptr fp1 = dz->infile;
  210. filename = (*cmdline)[0];
  211. if((dz->ifd[fileno] = sndopenEx(filename,0,CDP_OPEN_RDONLY)) < 0) {
  212. sprintf(errstr,"cannot open input file %s to read data.\n",filename);
  213. return(DATA_ERROR);
  214. }
  215. if((ifp = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  216. sprintf(errstr,"INSUFFICIENT MEMORY to store data on later infile. (1)\n");
  217. return(MEMORY_ERROR);
  218. }
  219. if((fp2 = (fileptr)malloc(sizeof(struct fileprops)))==NULL) {
  220. sprintf(errstr,"INSUFFICIENT MEMORY to store data on later infile. (2)\n");
  221. return(MEMORY_ERROR);
  222. }
  223. if((exit_status = readhead(ifp,dz->ifd[1],filename,&maxamp,&maxloc,&maxrep,getmax,getmaxinfo))<0)
  224. return(exit_status);
  225. copy_to_fileptr(ifp,fp2);
  226. if(fp2->filetype != ANALFILE) {
  227. sprintf(errstr,"%s is not an analysis file.\n",filename);
  228. return(DATA_ERROR);
  229. }
  230. if(fp2->origstype != fp1->origstype) {
  231. sprintf(errstr,"Incompatible original-sample-type in input file %s.\n",filename);
  232. return(DATA_ERROR);
  233. }
  234. if(fp2->origrate != fp1->origrate) {
  235. sprintf(errstr,"Incompatible original-sample-rate in input file %s.\n",filename);
  236. return(DATA_ERROR);
  237. }
  238. if(fp2->arate != fp1->arate) {
  239. sprintf(errstr,"Incompatible analysis-sample-rate in input file %s.\n",filename);
  240. return(DATA_ERROR);
  241. }
  242. if(fp2->Mlen != fp1->Mlen) {
  243. sprintf(errstr,"Incompatible analysis-window-length in input file %s.\n",filename);
  244. return(DATA_ERROR);
  245. }
  246. if(fp2->Dfac != fp1->Dfac) {
  247. sprintf(errstr,"Incompatible decimation factor in input file %s.\n",filename);
  248. return(DATA_ERROR);
  249. }
  250. if(fp2->channels != fp1->channels) {
  251. sprintf(errstr,"Incompatible channel-count in input file %s.\n",filename);
  252. return(DATA_ERROR);
  253. }
  254. if((dz->insams[fileno] = sndsizeEx(dz->ifd[fileno]))<0) { /* FIND SIZE OF FILE */
  255. sprintf(errstr, "Can't read size of input file %s.\n"
  256. "open_checktype_getsize_and_compareheader()\n",filename);
  257. return(PROGRAM_ERROR);
  258. }
  259. if(dz->insams[fileno]==0) {
  260. sprintf(errstr, "File %s contains no data.\n",filename);
  261. return(DATA_ERROR);
  262. }
  263. (*cmdline)++;
  264. (*cmdlinecnt)--;
  265. return(FINISHED);
  266. }
  267. /****************************** SET_PARAM_DATA *********************************/
  268. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  269. {
  270. ap->special_data = (char)special_data;
  271. ap->param_cnt = (char)paramcnt;
  272. ap->max_param_cnt = (char)maxparamcnt;
  273. if(ap->max_param_cnt>0) {
  274. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  275. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  276. return(MEMORY_ERROR);
  277. }
  278. strcpy(ap->param_list,paramlist);
  279. }
  280. return(FINISHED);
  281. }
  282. /****************************** SET_VFLGS *********************************/
  283. int set_vflgs
  284. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  285. {
  286. ap->option_cnt = (char) optcnt; /*RWD added cast */
  287. if(optcnt) {
  288. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  289. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  290. return(MEMORY_ERROR);
  291. }
  292. strcpy(ap->option_list,optlist);
  293. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  294. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  295. return(MEMORY_ERROR);
  296. }
  297. strcpy(ap->option_flags,optflags);
  298. }
  299. ap->vflag_cnt = (char) vflagcnt;
  300. ap->variant_param_cnt = (char) vparamcnt;
  301. if(vflagcnt) {
  302. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  303. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  304. return(MEMORY_ERROR);
  305. }
  306. strcpy(ap->variant_list,varlist);
  307. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  308. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  309. return(MEMORY_ERROR);
  310. }
  311. strcpy(ap->variant_flags,varflags);
  312. }
  313. return(FINISHED);
  314. }
  315. /***************************** APPLICATION_INIT **************************/
  316. int application_init(dataptr dz)
  317. {
  318. int exit_status;
  319. int storage_cnt;
  320. int tipc, brkcnt;
  321. aplptr ap = dz->application;
  322. if(ap->vflag_cnt>0)
  323. initialise_vflags(dz);
  324. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  325. ap->total_input_param_cnt = (char)tipc;
  326. if(tipc>0) {
  327. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  328. return(exit_status);
  329. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  330. return(exit_status);
  331. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  332. return(exit_status);
  333. }
  334. brkcnt = tipc;
  335. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  336. if(brkcnt>0) {
  337. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  338. return(exit_status);
  339. }
  340. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  341. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  342. return(exit_status);
  343. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  344. return(exit_status);
  345. }
  346. if((exit_status = mark_parameter_types(dz,ap))<0)
  347. return(exit_status);
  348. // establish_infile_constants() replaced by
  349. dz->infilecnt = ONE_NONSND_FILE;
  350. //establish_bufptrs_and_extra_buffers():
  351. dz->array_cnt=2;
  352. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  353. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  354. return(MEMORY_ERROR);
  355. }
  356. dz->parray[0] = NULL;
  357. dz->parray[1] = NULL;
  358. return(FINISHED);
  359. }
  360. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  361. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  362. {
  363. int n;
  364. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  365. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  366. return(MEMORY_ERROR);
  367. }
  368. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  369. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  370. return(MEMORY_ERROR);
  371. }
  372. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  373. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  374. return(MEMORY_ERROR);
  375. }
  376. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  377. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  378. return(MEMORY_ERROR);
  379. }
  380. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  381. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  382. return(MEMORY_ERROR);
  383. }
  384. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  385. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  386. return(MEMORY_ERROR);
  387. }
  388. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  389. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  390. return(MEMORY_ERROR);
  391. }
  392. for(n=0;n<brkcnt;n++) {
  393. dz->brk[n] = NULL;
  394. dz->brkptr[n] = NULL;
  395. dz->brkinit[n] = 0;
  396. dz->brksize[n] = 0;
  397. }
  398. return(FINISHED);
  399. }
  400. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  401. /* RWD mallo changed to calloc; helps debug verison run as release! */
  402. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  403. {
  404. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  405. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  406. return(MEMORY_ERROR);
  407. }
  408. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  409. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  410. return(MEMORY_ERROR);
  411. }
  412. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  413. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  414. return(MEMORY_ERROR);
  415. }
  416. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  417. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  418. return(MEMORY_ERROR);
  419. }
  420. return(FINISHED);
  421. }
  422. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  423. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  424. {
  425. int n;
  426. for(n=0;n<storage_cnt;n++) {
  427. dz->is_int[n] = (char)0;
  428. dz->no_brk[n] = (char)0;
  429. }
  430. return(FINISHED);
  431. }
  432. /***************************** MARK_PARAMETER_TYPES **************************/
  433. int mark_parameter_types(dataptr dz,aplptr ap)
  434. {
  435. int n, m; /* PARAMS */
  436. for(n=0;n<ap->max_param_cnt;n++) {
  437. switch(ap->param_list[n]) {
  438. case('0'): break; /* dz->is_active[n] = 0 is default */
  439. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  440. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  441. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  442. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  443. default:
  444. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  445. return(PROGRAM_ERROR);
  446. }
  447. } /* OPTIONS */
  448. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  449. switch(ap->option_list[n]) {
  450. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  451. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  452. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  453. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  454. default:
  455. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  456. return(PROGRAM_ERROR);
  457. }
  458. } /* VARIANTS */
  459. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  460. switch(ap->variant_list[n]) {
  461. case('0'): break;
  462. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  463. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  464. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  465. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  466. default:
  467. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  468. return(PROGRAM_ERROR);
  469. }
  470. } /* INTERNAL */
  471. for(n=0,
  472. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  473. switch(ap->internal_param_list[n]) {
  474. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  475. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  476. case('d'): dz->no_brk[m] = (char)1; break;
  477. default:
  478. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  479. return(PROGRAM_ERROR);
  480. }
  481. }
  482. return(FINISHED);
  483. }
  484. /***************************** HANDLE_THE_OUTFILE **************************/
  485. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,int is_launched,dataptr dz)
  486. {
  487. int exit_status;
  488. char *filename = NULL;
  489. filename = (*cmdline)[0];
  490. strcpy(dz->outfilename,filename);
  491. if((exit_status = create_sized_outfile(filename,dz))<0)
  492. return(exit_status);
  493. (*cmdline)++;
  494. (*cmdlinecnt)--;
  495. return(FINISHED);
  496. }
  497. /***************************** ESTABLISH_APPLICATION **************************/
  498. int establish_application(dataptr dz)
  499. {
  500. aplptr ap;
  501. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  502. sprintf(errstr,"establish_application()\n");
  503. return(MEMORY_ERROR);
  504. }
  505. ap = dz->application;
  506. memset((char *)ap,0,sizeof(struct applic));
  507. return(FINISHED);
  508. }
  509. /************************* INITIALISE_VFLAGS *************************/
  510. int initialise_vflags(dataptr dz)
  511. {
  512. int n;
  513. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  514. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  515. return(MEMORY_ERROR);
  516. }
  517. for(n=0;n<dz->application->vflag_cnt;n++)
  518. dz->vflag[n] = FALSE;
  519. return FINISHED;
  520. }
  521. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  522. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  523. {
  524. int n;
  525. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  526. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  527. return(MEMORY_ERROR);
  528. }
  529. for(n=0;n<tipc;n++)
  530. ap->default_val[n] = 0.0;
  531. return(FINISHED);
  532. }
  533. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  534. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  535. {
  536. int n;
  537. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  538. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  539. return(MEMORY_ERROR);
  540. }
  541. for(n=0;n<tipc;n++)
  542. dz->is_active[n] = (char)0;
  543. return(FINISHED);
  544. }
  545. /************************* SETUP_SPECENV_APPLICATION *******************/
  546. int setup_specenv_application(dataptr dz)
  547. {
  548. int exit_status;
  549. aplptr ap;
  550. if((exit_status = establish_application(dz))<0) // GLOBAL
  551. return(FAILED);
  552. ap = dz->application;
  553. // SEE parstruct FOR EXPLANATION of next 2 functions
  554. if((exit_status = set_param_data(ap,0 ,1,1,"i" ))<0)
  555. return(FAILED);
  556. if((exit_status = set_vflgs(ap,"b",1,"d","pik",3,0,"000"))<0)
  557. return(FAILED);
  558. // set_legal_infile_structure -->
  559. dz->has_otherfile = FALSE;
  560. // assign_process_logic -->
  561. dz->input_data_type = TWO_ANALFILES;
  562. dz->process_type = MIN_ANALFILE;
  563. dz->outfiletype = ANALFILE_OUT;
  564. return application_init(dz); //GLOBAL
  565. }
  566. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  567. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  568. {
  569. int exit_status;
  570. infileptr infile_info;
  571. if(!sloom) {
  572. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  573. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  574. return(MEMORY_ERROR);
  575. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  576. sprintf(errstr,"Failed tp parse input file %s\n",cmdline[0]);
  577. return(PROGRAM_ERROR);
  578. } else if(infile_info->filetype != ANALFILE) {
  579. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  580. return(DATA_ERROR);
  581. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  582. sprintf(errstr,"Failed to copy file parsing information\n");
  583. return(PROGRAM_ERROR);
  584. }
  585. free(infile_info);
  586. }
  587. dz->clength = dz->wanted / 2;
  588. dz->chwidth = dz->nyquist/(double)(dz->clength-1);
  589. dz->halfchwidth = dz->chwidth/2.0;
  590. return(FINISHED);
  591. }
  592. /************************* SETUP_SPECENV_PARAM_RANGES_AND_DEFAULTS *******************/
  593. int setup_specenv_param_ranges_and_defaults(dataptr dz)
  594. {
  595. int exit_status;
  596. aplptr ap = dz->application;
  597. // set_param_ranges()
  598. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  599. // NB total_input_param_cnt is > 0 !!!s
  600. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  601. return(FAILED);
  602. // get_param_ranges()
  603. ap->lo[0] = 1;
  604. ap->hi[0] = dz->clength;
  605. ap->default_val[0] = 60;
  606. ap->lo[1] = -1;
  607. ap->hi[1] = 1;
  608. ap->default_val[1] = 0;
  609. dz->maxmode = 0;
  610. if(!sloom)
  611. put_default_vals_in_all_params(dz);
  612. return(FINISHED);
  613. }
  614. /********************************* PARSE_SLOOM_DATA *********************************/
  615. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  616. {
  617. int exit_status;
  618. int cnt = 1, infilecnt;
  619. int filesize, insams, inbrksize;
  620. double dummy;
  621. int true_cnt = 0;
  622. aplptr ap;
  623. while(cnt<=PRE_CMDLINE_DATACNT) {
  624. if(cnt > argc) {
  625. sprintf(errstr,"Insufficient data sent from TK\n");
  626. return(DATA_ERROR);
  627. }
  628. switch(cnt) {
  629. case(1):
  630. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  631. sprintf(errstr,"Cannot read process no. sent from TK\n");
  632. return(DATA_ERROR);
  633. }
  634. break;
  635. case(2):
  636. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  637. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  638. return(DATA_ERROR);
  639. }
  640. if(dz->mode > 0)
  641. dz->mode--;
  642. //setup_particular_application() =
  643. if((exit_status = setup_specenv_application(dz))<0)
  644. return(exit_status);
  645. ap = dz->application;
  646. break;
  647. case(3):
  648. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  649. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  650. return(DATA_ERROR);
  651. }
  652. if(infilecnt < 1) {
  653. true_cnt = cnt + 1;
  654. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  655. }
  656. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  657. return(exit_status);
  658. break;
  659. case(INPUT_FILETYPE+4):
  660. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  661. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  662. return(DATA_ERROR);
  663. }
  664. break;
  665. case(INPUT_FILESIZE+4):
  666. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  667. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  668. return(DATA_ERROR);
  669. }
  670. dz->insams[0] = filesize;
  671. break;
  672. case(INPUT_INSAMS+4):
  673. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  674. sprintf(errstr,"Cannot read insams sent from TK\n");
  675. return(DATA_ERROR);
  676. }
  677. dz->insams[0] = insams;
  678. break;
  679. case(INPUT_SRATE+4):
  680. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  681. sprintf(errstr,"Cannot read srate sent from TK\n");
  682. return(DATA_ERROR);
  683. }
  684. break;
  685. case(INPUT_CHANNELS+4):
  686. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  687. sprintf(errstr,"Cannot read channels sent from TK\n");
  688. return(DATA_ERROR);
  689. }
  690. break;
  691. case(INPUT_STYPE+4):
  692. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  693. sprintf(errstr,"Cannot read stype sent from TK\n");
  694. return(DATA_ERROR);
  695. }
  696. break;
  697. case(INPUT_ORIGSTYPE+4):
  698. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  699. sprintf(errstr,"Cannot read origstype sent from TK\n");
  700. return(DATA_ERROR);
  701. }
  702. break;
  703. case(INPUT_ORIGRATE+4):
  704. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  705. sprintf(errstr,"Cannot read origrate sent from TK\n");
  706. return(DATA_ERROR);
  707. }
  708. break;
  709. case(INPUT_MLEN+4):
  710. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  711. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  712. return(DATA_ERROR);
  713. }
  714. break;
  715. case(INPUT_DFAC+4):
  716. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  717. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  718. return(DATA_ERROR);
  719. }
  720. break;
  721. case(INPUT_ORIGCHANS+4):
  722. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  723. sprintf(errstr,"Cannot read origchans sent from TK\n");
  724. return(DATA_ERROR);
  725. }
  726. break;
  727. case(INPUT_SPECENVCNT+4):
  728. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  729. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  730. return(DATA_ERROR);
  731. }
  732. dz->specenvcnt = dz->infile->specenvcnt;
  733. break;
  734. case(INPUT_WANTED+4):
  735. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  736. sprintf(errstr,"Cannot read wanted sent from TK\n");
  737. return(DATA_ERROR);
  738. }
  739. break;
  740. case(INPUT_WLENGTH+4):
  741. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  742. sprintf(errstr,"Cannot read wlength sent from TK\n");
  743. return(DATA_ERROR);
  744. }
  745. break;
  746. case(INPUT_OUT_CHANS+4):
  747. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  748. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  749. return(DATA_ERROR);
  750. }
  751. break;
  752. /* RWD these chanegs to samps - tk will have to deal with that! */
  753. case(INPUT_DESCRIPTOR_BYTES+4):
  754. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  755. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  756. return(DATA_ERROR);
  757. }
  758. break;
  759. case(INPUT_IS_TRANSPOS+4):
  760. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  761. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  762. return(DATA_ERROR);
  763. }
  764. break;
  765. case(INPUT_COULD_BE_TRANSPOS+4):
  766. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  767. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  768. return(DATA_ERROR);
  769. }
  770. break;
  771. case(INPUT_COULD_BE_PITCH+4):
  772. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  773. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  774. return(DATA_ERROR);
  775. }
  776. break;
  777. case(INPUT_DIFFERENT_SRATES+4):
  778. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  779. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  780. return(DATA_ERROR);
  781. }
  782. break;
  783. case(INPUT_DUPLICATE_SNDS+4):
  784. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  785. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  786. return(DATA_ERROR);
  787. }
  788. break;
  789. case(INPUT_BRKSIZE+4):
  790. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  791. sprintf(errstr,"Cannot read brksize sent from TK\n");
  792. return(DATA_ERROR);
  793. }
  794. if(inbrksize > 0) {
  795. switch(dz->input_data_type) {
  796. case(WORDLIST_ONLY):
  797. break;
  798. case(PITCH_AND_PITCH):
  799. case(PITCH_AND_TRANSPOS):
  800. case(TRANSPOS_AND_TRANSPOS):
  801. dz->tempsize = inbrksize;
  802. break;
  803. case(BRKFILES_ONLY):
  804. case(UNRANGED_BRKFILE_ONLY):
  805. case(DB_BRKFILES_ONLY):
  806. case(ALL_FILES):
  807. case(ANY_NUMBER_OF_ANY_FILES):
  808. if(dz->extrabrkno < 0) {
  809. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  810. return(DATA_ERROR);
  811. }
  812. if(dz->brksize == NULL) {
  813. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  814. return(PROGRAM_ERROR);
  815. }
  816. dz->brksize[dz->extrabrkno] = inbrksize;
  817. break;
  818. default:
  819. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  820. dz->input_data_type);
  821. return(PROGRAM_ERROR);
  822. }
  823. break;
  824. }
  825. break;
  826. case(INPUT_NUMSIZE+4):
  827. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  828. sprintf(errstr,"Cannot read numsize sent from TK\n");
  829. return(DATA_ERROR);
  830. }
  831. break;
  832. case(INPUT_LINECNT+4):
  833. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  834. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  835. return(DATA_ERROR);
  836. }
  837. break;
  838. case(INPUT_ALL_WORDS+4):
  839. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  840. sprintf(errstr,"Cannot read all_words sent from TK\n");
  841. return(DATA_ERROR);
  842. }
  843. break;
  844. case(INPUT_ARATE+4):
  845. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  846. sprintf(errstr,"Cannot read arate sent from TK\n");
  847. return(DATA_ERROR);
  848. }
  849. break;
  850. case(INPUT_FRAMETIME+4):
  851. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  852. sprintf(errstr,"Cannot read frametime sent from TK\n");
  853. return(DATA_ERROR);
  854. }
  855. dz->frametime = (float)dummy;
  856. break;
  857. case(INPUT_WINDOW_SIZE+4):
  858. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  859. sprintf(errstr,"Cannot read window_size sent from TK\n");
  860. return(DATA_ERROR);
  861. }
  862. break;
  863. case(INPUT_NYQUIST+4):
  864. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  865. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  866. return(DATA_ERROR);
  867. }
  868. break;
  869. case(INPUT_DURATION+4):
  870. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  871. sprintf(errstr,"Cannot read duration sent from TK\n");
  872. return(DATA_ERROR);
  873. }
  874. break;
  875. case(INPUT_MINBRK+4):
  876. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  877. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  878. return(DATA_ERROR);
  879. }
  880. break;
  881. case(INPUT_MAXBRK+4):
  882. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  883. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  884. return(DATA_ERROR);
  885. }
  886. break;
  887. case(INPUT_MINNUM+4):
  888. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  889. sprintf(errstr,"Cannot read minnum sent from TK\n");
  890. return(DATA_ERROR);
  891. }
  892. break;
  893. case(INPUT_MAXNUM+4):
  894. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  895. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  896. return(DATA_ERROR);
  897. }
  898. break;
  899. default:
  900. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  901. return(PROGRAM_ERROR);
  902. }
  903. cnt++;
  904. }
  905. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  906. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  907. return(DATA_ERROR);
  908. }
  909. if(true_cnt)
  910. cnt = true_cnt;
  911. *cmdlinecnt = 0;
  912. while(cnt < argc) {
  913. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  914. return(exit_status);
  915. cnt++;
  916. }
  917. return(FINISHED);
  918. }
  919. /********************************* GET_TK_CMDLINE_WORD *********************************/
  920. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  921. {
  922. if(*cmdlinecnt==0) {
  923. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  924. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  925. return(MEMORY_ERROR);
  926. }
  927. } else {
  928. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  929. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  930. return(MEMORY_ERROR);
  931. }
  932. }
  933. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  934. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  935. return(MEMORY_ERROR);
  936. }
  937. strcpy((*cmdline)[*cmdlinecnt],q);
  938. (*cmdlinecnt)++;
  939. return(FINISHED);
  940. }
  941. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  942. int assign_file_data_storage(int infilecnt,dataptr dz)
  943. {
  944. int exit_status;
  945. int no_sndfile_system_files = FALSE;
  946. dz->infilecnt = infilecnt;
  947. if((exit_status = allocate_filespace(dz))<0)
  948. return(exit_status);
  949. if(no_sndfile_system_files)
  950. dz->infilecnt = 0;
  951. return(FINISHED);
  952. }
  953. /*********************** CHECK_SPECENV_PARAM_VALIDITY_AND_CONSISTENCY *********************/
  954. int check_specenv_param_validity_and_consistency(dataptr dz)
  955. {
  956. int n, m;
  957. double nextfrq, frqstep, jj, jj1, jj2;
  958. if(dz->insams[0] > dz->insams[1]) {
  959. sprintf(errstr,"First file is longer than 2nd: cannot proceed.\n");
  960. return(GOAL_FAILED);
  961. }
  962. if(dz->vflag[0]) { // IF PITCHWISE
  963. if(dz->iparam[0] > 4) {
  964. sprintf(errstr,"For octave-wise spectral envelope, max octaves-per-window is 4.\n");
  965. return(DATA_ERROR);
  966. }
  967. }
  968. if(dz->param[1] == 1.0) {
  969. sprintf(errstr,"Input file1 is not affected, if balance is set at 1.\n");
  970. return(DATA_ERROR);
  971. }
  972. if(dz->param[1] == -1.0) {
  973. sprintf(errstr,"Input file1 is merely replace by file2, if balance is set at -1.\n");
  974. return(DATA_ERROR);
  975. }
  976. if((dz->specenvfrq = (float *)malloc(dz->wanted * sizeof(float)))==NULL) {
  977. sprintf(errstr,"INSUFFICIENT MEMORY for spectral envelope lower frequency boundaries.\n");
  978. return(MEMORY_ERROR);
  979. }
  980. if((dz->specenvtop = (float *)malloc(dz->wanted * sizeof(float)))==NULL) {
  981. sprintf(errstr,"INSUFFICIENT MEMORY for spectral envelope upper frequency boundaries.\n");
  982. return(MEMORY_ERROR);
  983. }
  984. if((dz->specenvamp = (float *)malloc(dz->wanted * sizeof(float)))==NULL) {
  985. sprintf(errstr,"INSUFFICIENT MEMORY for 1st spectral envelope amplitudes.\n");
  986. return(MEMORY_ERROR);
  987. }
  988. if((dz->specenvamp2 = (float *)malloc(dz->wanted * sizeof(float)))==NULL) {
  989. sprintf(errstr,"INSUFFICIENT MEMORY for 2nd spectral envelope amplitudes.\n");
  990. return(MEMORY_ERROR);
  991. }
  992. if((dz->spececentrfrq = (float *)malloc((dz->wanted + 1) * sizeof(float)))==NULL) {
  993. sprintf(errstr,"INSUFFICIENT MEMORY for 2nd spectral envelope amplitudes.\n");
  994. return(MEMORY_ERROR);
  995. }
  996. n = 0;
  997. dz->specenvfrq[n] = 0.0;
  998. nextfrq = dz->halfchwidth;
  999. dz->specenvtop[n] = (float)nextfrq;
  1000. n++;
  1001. if(dz->vflag[0]) // octave-wise envelopes
  1002. frqstep = pow(2.0,dz->iparam[0]); // N-octave frq multiplier
  1003. else // frequency-wise envelopes
  1004. frqstep = dz->chwidth * dz->iparam[0]; // equal frequency steps
  1005. while(nextfrq < dz->nyquist) {
  1006. if(n >= dz->clength) {
  1007. sprintf(errstr,"INSUFFICIENT MEMORY for spectral envelope data.\n");
  1008. return(PROGRAM_ERROR);
  1009. }
  1010. dz->specenvfrq[n] = (float)nextfrq;
  1011. if(dz->vflag[0])
  1012. nextfrq *= frqstep;
  1013. else
  1014. nextfrq += frqstep;
  1015. dz->specenvtop[n] = (float)nextfrq;
  1016. n++;
  1017. }
  1018. dz->specenvcnt = n;
  1019. dz->spececentrfrq[0] = 0.0;
  1020. if(dz->vflag[0]) {
  1021. for(n = 0, m= 1; n < dz->specenvcnt; n++,m++) {
  1022. hztomidi(&jj1,dz->specenvtop[n]);
  1023. hztomidi(&jj2,dz->specenvfrq[n]);
  1024. jj = (jj1 + jj2)/2.0;
  1025. dz->spececentrfrq[m] = (float)miditohz(jj); // NB THESE ARE STORED AS FREQUENCIES
  1026. }
  1027. } else {
  1028. for(n = 0, m= 1; n < dz->specenvcnt; n++,m++)
  1029. dz->spececentrfrq[m] = (float)((dz->specenvtop[n] + dz->specenvfrq[n])/2.0);
  1030. }
  1031. return FINISHED;
  1032. }
  1033. /************************* redundant functions: to ensure libs compile OK *******************/
  1034. int assign_process_logic(dataptr dz)
  1035. {
  1036. return(FINISHED);
  1037. }
  1038. void set_legal_infile_structure(dataptr dz)
  1039. {}
  1040. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  1041. {
  1042. return(FINISHED);
  1043. }
  1044. int setup_internal_arrays_and_array_pointers(dataptr dz)
  1045. {
  1046. return(FINISHED);
  1047. }
  1048. int establish_bufptrs_and_extra_buffers(dataptr dz)
  1049. {
  1050. return(FINISHED);
  1051. }
  1052. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1053. {
  1054. return(FINISHED);
  1055. }
  1056. int read_special_data(char *str,dataptr dz)
  1057. {
  1058. return(FINISHED);
  1059. }
  1060. /********************************************************************************************/
  1061. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1062. {
  1063. if (!strcmp(prog_identifier_from_cmdline,"specenv")) dz->process = SPECENV;
  1064. else {
  1065. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1066. return(USAGE_ONLY);
  1067. }
  1068. return(FINISHED);
  1069. }
  1070. /**************************** allocate_specenv_buffer ******************************/
  1071. int allocate_specenv_buffer(dataptr dz)
  1072. {
  1073. unsigned int buffersize;
  1074. buffersize = dz->wanted * (dz->bptrcnt + 1);
  1075. dz->buflen = dz->wanted;
  1076. if((dz->bigfbuf = (float*) malloc(buffersize * sizeof(float)))==NULL) {
  1077. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  1078. return(MEMORY_ERROR);
  1079. }
  1080. dz->flbufptr[SE_IBUF1] = dz->bigfbuf; // inbuf1
  1081. dz->flbufptr[SE_IBUF2] = dz->flbufptr[SE_IBUF1] + dz->wanted; // inbuf2
  1082. dz->flbufptr[SE_OBUF] = dz->flbufptr[SE_IBUF2] + dz->wanted; // obuf
  1083. dz->flbufptr[SE_BUFEND] = dz->flbufptr[SE_OBUF] + dz->wanted; // end of bufs
  1084. return(FINISHED);
  1085. }
  1086. /******************************** USAGE1 ********************************/
  1087. int usage1(void)
  1088. {
  1089. return(usage2("specenv"));
  1090. }
  1091. /******************************** USAGE2 ********************************/
  1092. int usage2(char *str)
  1093. {
  1094. if(!strcmp(str,"specenv")) {
  1095. fprintf(stderr,
  1096. "USAGE:\n"
  1097. "specenv specenv inanalfil1 inanalfil2 outanalfil windowsize [-bbal] [-p] [-i] [-k]\n"
  1098. "\n"
  1099. "Get the spectral envelope of file 2 and apply it to file 1.\n"
  1100. "(File 2 must be at least as long as file 1).\n"
  1101. "\n"
  1102. "BAL proportion of original files in output.\n"
  1103. " bal > 1 : balance of shaped-file to infile1 = (1-bal) : bal\n"
  1104. " (Higher balance keeps more of the original file1)\n"
  1105. " bal < 1 : balance of shaped-file to infile2 = (1+bal) : -bal\n"
  1106. " (Lower balance keeps more of the imposed file2)\n"
  1107. " default 0.0 (none of the original files in the output).\n"
  1108. "\n"
  1109. "-p : windowsize counted in octave steps.\n"
  1110. " Default: counted in analysis-channel-widths (srate/anal-chans).\n"
  1111. "\n"
  1112. "-i : IMPOSE spectral envelope (default, REPLACE spectral envelope)\n"
  1113. "\n"
  1114. "-k : KEEP the loudness contour of the imposed file.\n"
  1115. " Default: keep the loudness contour of the original file.\n"
  1116. "\n"
  1117. "Process equivalent to format extraction + formant impose/replace\n"
  1118. "but allows for larger spectral windows.\n"
  1119. "\n");
  1120. } else {
  1121. fprintf(stderr,
  1122. "Unknown option '%s'\n"
  1123. "USAGE:\n"
  1124. "specenv specenv inanalfil1 inanalfil2 outanalfil windowsize [-f] [-i]\n",str);
  1125. }
  1126. return(USAGE_ONLY);
  1127. }
  1128. int usage3(char *str1,char *str2)
  1129. {
  1130. fprintf(stderr,"Insufficient parameters on command line.\n");
  1131. return(USAGE_ONLY);
  1132. }
  1133. /*********************** INNER_LOOP ***************************/
  1134. int inner_loop
  1135. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1136. {
  1137. return FINISHED;
  1138. }
  1139. /**************************** DO_SPECENV ****************************/
  1140. int do_specenv(dataptr dz)
  1141. {
  1142. int exit_status, cc, vc, cnt, botchan, topchan, bwidth_in_chans;
  1143. int n, samps_read1, samps_read2, wcnt;
  1144. float *ibuf1, *ibuf2, *obuf;
  1145. float topfreq, botfreq, frq, specfrq, up_specfrq, dn_specfrq, loamp, hiamp, amp1 = 0.0, amp2;
  1146. double diff, ratio, pch, up_specpch, dn_specpch, ampdiff, ampstep, maxiamp = 0.0, maxiamp2 = 0.0, maxoamp = 0.0;
  1147. double balance = dz->param[1];
  1148. ibuf1 = dz->flbufptr[SE_IBUF1];
  1149. ibuf2 = dz->flbufptr[SE_IBUF2];
  1150. obuf = dz->flbufptr[SE_OBUF];
  1151. // READ A WINDOW FROM EACH FILE
  1152. wcnt = 0;
  1153. while((samps_read1 = fgetfbufEx(ibuf1, dz->buflen,dz->ifd[0],0)) > 0) {
  1154. if(samps_read1 < 0) {
  1155. sprintf(errstr,"Failed to read data from first input file.\n");
  1156. return(SYSTEM_ERROR);
  1157. }
  1158. samps_read2 = fgetfbufEx(ibuf2, dz->buflen,dz->ifd[1],0);
  1159. if(samps_read2 < 0) {
  1160. sprintf(errstr,"Failed to read data from second input file.\n");
  1161. return(SYSTEM_ERROR);
  1162. }
  1163. topfreq = 0.0f;
  1164. n = 0;
  1165. while(n < dz->specenvcnt) { // Extract spectral envelope of both files
  1166. botfreq = topfreq;
  1167. botchan = (int)floor(botfreq/dz->chwidth); /* TRUNCATE */
  1168. botchan -= CHAN_SRCHRANGE_F;
  1169. botchan = max(botchan,0);
  1170. topfreq = dz->specenvtop[n];
  1171. topchan = (int)floor(topfreq/dz->chwidth); /* TRUNCATE */
  1172. topchan += CHAN_SRCHRANGE_F;
  1173. topchan = min(topchan,dz->clength);
  1174. for(cc = botchan,vc = botchan * 2; cc < topchan; cc++,vc += 2) {
  1175. if(fabs(ibuf1[FREQ]) >= botfreq && fabs(ibuf1[FREQ]) < topfreq)
  1176. dz->specenvamp[n] = (float)(dz->specenvamp[n] + ibuf1[AMPP]);
  1177. if(fabs(ibuf2[FREQ]) >= botfreq && fabs(ibuf2[FREQ]) < topfreq)
  1178. dz->specenvamp2[n] = (float)(dz->specenvamp2[n] + ibuf2[AMPP]);
  1179. }
  1180. bwidth_in_chans = max(1,(int)round((topfreq - botfreq)/dz->chwidth));
  1181. dz->specenvamp[n] = (float)(dz->specenvamp[n]/bwidth_in_chans);
  1182. dz->specenvamp2[n] = (float)(dz->specenvamp2[n]/bwidth_in_chans);
  1183. n++;
  1184. }
  1185. if(!dz->vflag[2]) {
  1186. maxiamp = 0.0;
  1187. maxiamp2 = 0.0;
  1188. maxoamp = 0.0;
  1189. }
  1190. for(cc = 0,vc = 0; cc < dz->clength; cc++,vc += 2) {
  1191. // FOR EACH FREQUNCY IN THE SPECTRUM ....
  1192. frq = (float)fabs(ibuf1[FREQ]);
  1193. // FIND THE SPECTRAL ENVELOPE LEVELS (amp1 & amp2) corresponding TO THIS FRQ
  1194. cnt = 1; // speccentrecnt counts 0 to n | | | | centre frqs of bands + val at 0Hz
  1195. // specenv boundaries 0 to n-1 |___|___|___ bottom frqs of bands
  1196. specfrq = dz->spececentrfrq[cnt]; // specamp vals 0 to n-1 | | | average amplitudes of bands
  1197. while(frq > specfrq) {
  1198. cnt++; // Search envelope bands until envband-frq is > input frq
  1199. specfrq = dz->spececentrfrq[cnt];
  1200. }
  1201. if(dz->vflag[0]) { // PITCHWISE
  1202. hztomidi(&pch,frq);
  1203. hztomidi(&up_specpch,specfrq);
  1204. cnt--;
  1205. hztomidi(&dn_specpch,dz->spececentrfrq[cnt]);
  1206. diff = up_specpch - dn_specpch;
  1207. ratio = (pch - dn_specpch)/diff;
  1208. } else { // FRQWISE // thisfrq = * 0 1 2* 3 4
  1209. up_specfrq = specfrq; // specenv boundaries |___|___|*__|___|___ bottom frqs of bands
  1210. cnt--; // speccentrefrq-hi x x x *| x x cnt = 3
  1211. dn_specfrq = dz->spececentrfrq[cnt]; // speccentrefrq-lo x x | *x x x cnt = 2
  1212. diff = up_specfrq - dn_specfrq; // cnt of centres 0 1 ~2~ ~3~ 4 5
  1213. ratio = (frq - dn_specfrq)/diff; // \
  1214. // count of HIampval (below) 0 1 ~2~ 3 4
  1215. // HIamp a a A a a cnt = 2 (for hiamp)
  1216. }
  1217. // INTERPOLATE FOR SPECTRAL ENVELOPE AMPLITUDE AT THIS PARTICULAR FREQUENCY, IN BOTH ENVELOPES (if ness)
  1218. if(!dz->vflag[1]) { // i.e. IMPOSE rather than REPLACE
  1219. hiamp = dz->specenvamp[cnt]; // count of ampvals 0 1 ~2~ 3 4
  1220. loamp = dz->specenvamp[cnt - 1]; // hiamp a a A a a
  1221. ampdiff = hiamp - loamp; // loamp a A a a a
  1222. ampstep = ampdiff * ratio; // count of ampvals 0 ~1~ 2 3 4
  1223. amp1 = (float)(loamp + ampstep);
  1224. }
  1225. hiamp = dz->specenvamp2[cnt];
  1226. loamp = dz->specenvamp2[cnt - 1];
  1227. ampdiff = hiamp - loamp;
  1228. ampstep = ampdiff * ratio;
  1229. amp2 = (float)(loamp + ampstep);
  1230. if(dz->vflag[1]) // IMPOSE
  1231. obuf[AMPP] = (float)(ibuf1[AMPP] * amp2);
  1232. else { // REPLACE
  1233. if(amp1 > MINAMP)
  1234. obuf[AMPP] = (float)(ibuf1[AMPP] * amp2/amp1);
  1235. else
  1236. obuf[AMPP] = ibuf1[AMPP];
  1237. }
  1238. obuf[FREQ] = ibuf1[FREQ];
  1239. if(!dz->vflag[2]) {
  1240. maxiamp = max(maxiamp,ibuf1[AMPP]);
  1241. maxiamp2 = max(maxiamp2,ibuf2[AMPP]);
  1242. maxoamp = max(maxoamp,obuf[AMPP]);
  1243. }
  1244. }
  1245. if(!dz->vflag[2]) {
  1246. if((maxiamp2 < MINAMP) && maxiamp > MINAMP) { // If the superimposed spectrum level is (almost) zero, and the orig spectrum isn't
  1247. for(cc = 0,vc = 0; cc <dz->clength; cc++, vc +=2) // Keep the orig spectrum
  1248. obuf[AMPP] = ibuf1[AMPP];
  1249. } else if(maxoamp > MINAMP) { // Else (if the maxoutput spectrum is not almost zero)
  1250. for(cc = 0,vc = 0; cc <dz->clength; cc++, vc +=2) // adjust output level to level of input
  1251. obuf[AMPP] = (float)(obuf[AMPP] * maxiamp/maxoamp);
  1252. } else if(maxiamp > MINAMP) { // else, if input is not (nearly) zero, replace output by input
  1253. for(cc = 0,vc = 0; cc <dz->clength; cc++, vc +=2)
  1254. obuf[AMPP] = ibuf1[AMPP];
  1255. }
  1256. }
  1257. if(balance > 0.0) {
  1258. for(cc = 0,vc = 0; cc <dz->clength; cc++, vc +=2)
  1259. obuf[AMPP] = (float)((obuf[AMPP] * (1.0 - balance)) + (ibuf1[AMPP] * balance));
  1260. } else if(balance < 0.0) {
  1261. for(cc = 0,vc = 0; cc <dz->clength; cc++, vc +=2)
  1262. obuf[AMPP] = (float)((obuf[AMPP] * (1.0 + balance)) - (ibuf2[AMPP] * balance));
  1263. }
  1264. if((exit_status = write_samps(obuf,dz->wanted,dz))<0)
  1265. return(exit_status);
  1266. wcnt++;
  1267. }
  1268. return FINISHED;
  1269. }