readfiles.c 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673
  1. /*
  2. * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. /* floatsam version*/
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <structures.h>
  25. #include <tkglobals.h>
  26. #include <cdpmain.h>
  27. #include <filetype.h>
  28. #include <globcon.h>
  29. #include <formants.h>
  30. #include <processno.h>
  31. #include <modeno.h>
  32. #include <logic.h>
  33. #include <special.h>
  34. #include <speccon.h>
  35. #include <sfsys.h>
  36. #ifdef _DEBUG
  37. #include <assert.h>
  38. #endif
  39. #include <string.h> /*RWD */
  40. #if defined unix || defined _MSC_VER
  41. #define round(x) lround((x))
  42. #endif
  43. static int get_pitch_or_transpos_binarydata_from_first_file(float **thisdata,dataptr dz);
  44. static int read_pitch_or_transposition_brkvals(char *filename,double **brktable,int *brksize);
  45. static int store_numbers(char *filename,dataptr dz);
  46. static int store_wordlist(char *filename,dataptr dz);
  47. static int store_brktable(char *filename,dataptr dz);
  48. static int open_checktype_getsize_and_compareheader(char *filename,int fileno,fileptr *fp2,dataptr dz);
  49. //TW NEW
  50. //static int headcompare_and_update(int fd,char *filename,int *this_filetype,fileptr *fp2,dataptr dz);
  51. static int headcompare_and_update(int fd,char *filename,int *this_filetype,fileptr *fp2,int fileno,dataptr dz);
  52. static int set_otherfile_header(int fd,char *filename,dataptr dz);
  53. //TW NEW
  54. //static int check_later_filetype_valid_for_process(char *filename,int file_type,dataptr dz);
  55. static int check_later_filetype_valid_for_process(char *filename,int file_type,int fileno,dataptr dz);
  56. static int check_for_data_in_later_file(char *filename,int filetype,int fileno,dataptr dz);
  57. static int read_brkvals_from_other_file(FILE *fp,char *filename,dataptr dz);
  58. static int read_dB_brkvals_from_other_file(FILE *fp,char *filename,dataptr dz);
  59. static int setup_valid_wlength(dataptr dz);
  60. static int get_pitch_or_transpos_binarydata_from_other_file(int max_arraysize,int fileno,
  61. float **thisdata,fileptr fp2,dataptr dz);
  62. static int getsize_and_get_brkpntdata_from_other_pitch_or_transpos_file
  63. (char *filename,double minval, double maxval,int which_type, dataptr dz);
  64. static int establish_minwindowlength_or_minduration_in_secs(double *brktable,int brksize,char *filename,dataptr dz);
  65. static int establish_duration_in_secs(double *duration,double *brktable,int brksize,char *filename);
  66. #ifdef NOTDEF
  67. static int check_for_pitch_zeros(char *filename,float *pitcharray,int wlen);
  68. #endif
  69. static int test_brkvals(double minval,double maxval,float *floatarray,int arraysize);
  70. static int inform_infile_structure(fileptr fp1,fileptr fp2,dataptr dz);
  71. /************************************************************************************/
  72. /************************************************************************************/
  73. /* READING THE FIRST FILE : WHERE DATA IS KNOWN FROM PARSING PROCESS */
  74. /************************************************************************************/
  75. /************************************************************************************/
  76. /************************** OPEN_FIRST_INFILE *****************************/
  77. int open_first_infile(char *filename,dataptr dz)
  78. {
  79. int exit_status;
  80. int arraycnt;
  81. switch(dz->infile->filetype) {
  82. case(ANYFILE):
  83. break;
  84. case(SNDFILE): case(ANALFILE): case(PITCHFILE):
  85. case(TRANSPOSFILE): case(FORMANTFILE): case(ENVFILE):
  86. if((dz->ifd[0] = sndopenEx(filename,0,CDP_OPEN_RDONLY)) < 0) {
  87. sprintf(errstr,"Failure to open file %s for input.\n",filename);
  88. return(SYSTEM_ERROR);
  89. }
  90. #ifdef _DEBUG
  91. assert(dz->insams[0] >0);
  92. #endif
  93. /* RWD Feb 2007 workaround for close/reopen problem */
  94. #ifdef _WIN32
  95. sndseekEx(dz->ifd[0],0,0);
  96. #endif
  97. switch(dz->infile->filetype) {
  98. case(PITCHFILE):
  99. if((dz->pitches = (float *)malloc((size_t) (dz->insams[0] * sizeof(float))))==NULL) {
  100. sprintf(errstr,"INSUFFICIENT MEMORY to store binary pitch data.\n");
  101. return(MEMORY_ERROR);
  102. }
  103. if((exit_status = get_pitch_or_transpos_binarydata_from_first_file(&(dz->pitches),dz))<0)
  104. return(exit_status);
  105. break;
  106. case(TRANSPOSFILE):
  107. if((dz->transpos = (float *)malloc((size_t)(dz->insams[0] * sizeof(float))))==NULL) {
  108. sprintf(errstr,"INSUFFICIENT MEMORY to store binary transposition data.\n");
  109. return(MEMORY_ERROR);
  110. }
  111. if((exit_status = get_pitch_or_transpos_binarydata_from_first_file(&(dz->transpos),dz))<0)
  112. return(exit_status);
  113. break;
  114. case(FORMANTFILE):
  115. if((exit_status = initialise_specenv(&arraycnt,dz))<0)
  116. return(exit_status);
  117. break;
  118. }
  119. break;
  120. case(TEXTFILE):
  121. if((exit_status = read_pitch_or_transposition_brkvals(filename,&(dz->temp),&(dz->tempsize)))<0)
  122. return(exit_status);
  123. break;
  124. case(BRKFILE):
  125. case(DB_BRKFILE):
  126. case(UNRANGED_BRKFILE):
  127. if((exit_status = store_brktable(filename,dz))<0)
  128. return(exit_status);
  129. if(dz->input_data_type!=ALL_FILES && dz->input_data_type!=ANY_NUMBER_OF_ANY_FILES)
  130. dz->infilecnt = 0;
  131. break;
  132. case(NUMLIST):
  133. if((exit_status = store_numbers(filename,dz))<0)
  134. return(exit_status);
  135. dz->infilecnt = 0;
  136. break;
  137. case(SNDLIST):
  138. case(SYNCLIST):
  139. case(MIXFILE):
  140. case(LINELIST):
  141. case(WORDLIST):
  142. if((exit_status = store_wordlist(filename,dz))<0)
  143. return(exit_status);
  144. if(dz->input_data_type!=ALL_FILES && dz->input_data_type!=ANY_NUMBER_OF_ANY_FILES)
  145. dz->infilecnt = 0;
  146. break;
  147. default:
  148. sprintf(errstr,"Unknown filetype: open_first_infile()\n");
  149. return(PROGRAM_ERROR);
  150. }
  151. if(dz->infilecnt>0 && dz->infile->filetype!=TEXTFILE)
  152. dz->samps_left = dz->insams[0];
  153. return(FINISHED);
  154. }
  155. /********************* GET_PITCH_OR_TRANSPOS_BINARYDATA_FROM_FIRST_FILE *************************/
  156. int get_pitch_or_transpos_binarydata_from_first_file(float **thisdata,dataptr dz)
  157. {
  158. int /*seccnt,*/ samps_read;
  159. int samps_to_read = dz->insams[0];
  160. unsigned int arraysize;
  161. if((*thisdata = (float *)malloc((size_t)(samps_to_read * sizeof(float))))==NULL) {
  162. sprintf(errstr,"INSUFFICIENT MEMORY to store binary pitch or transposition data.\n");
  163. return(MEMORY_ERROR);
  164. }
  165. if((samps_read = fgetfbufEx((*thisdata), samps_to_read,dz->ifd[0],0))<0) {
  166. sprintf(errstr,"Sound read error.\n");
  167. return(SYSTEM_ERROR);
  168. }
  169. if(samps_read!= dz->insams[0]) {
  170. sprintf(errstr,"Problem reading data: get_pitch_or_transpos_binarydata_from_first_file()\n");
  171. return(PROGRAM_ERROR);
  172. }
  173. arraysize = samps_read;
  174. if((*thisdata = (float *)realloc((char *)(*thisdata),(arraysize + 1) * sizeof(float)))==NULL) {
  175. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate binary pitch or transposition data.\n"); /* 1 float for safety */
  176. return(MEMORY_ERROR);
  177. }
  178. (*thisdata)[arraysize] = 0.0f; /* SAFETY POSITION */
  179. return(FINISHED);
  180. }
  181. /************************* READ_PITCH_OR_TRANSPOSITION_BRKVALS *****************************/
  182. int read_pitch_or_transposition_brkvals(char *filename,double **brktable,int *brksize)
  183. {
  184. int arraysize = (*brksize) * 2;
  185. double *p, d;
  186. int n = 0,m, final_size;
  187. char temp[200], *q;
  188. FILE *fp;
  189. if((fp = fopen(filename,"r"))==NULL) {
  190. sprintf(errstr, "Can't open file %s to read data.\n",filename);
  191. return(DATA_ERROR);
  192. }
  193. #ifdef IS_CDPMAIN_TESTING
  194. if(*brksize <= 0) {
  195. sprintf(errstr,"Array size not set: read_pitch_or_transposition_brkvals()\n");
  196. return(PROGRAM_ERROR);
  197. }
  198. #endif
  199. if((*brktable = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  200. sprintf(errstr,"INSUFFICIENT MEMORY to store pitch or transposition brktable data.\n");
  201. return(MEMORY_ERROR);
  202. }
  203. p = *brktable;
  204. while(fgets(temp,200,fp)==temp) { /* READ AND TEST BRKPNT VALS */
  205. q = temp;
  206. while(get_float_from_within_string(&q,&d)) {
  207. #ifdef IS_CDPMAIN_TESTING
  208. if(n >= arraysize) {
  209. sprintf(errstr,"More values found than indicated by parse.\n");
  210. return(PROGRAM_ERROR);
  211. }
  212. #endif
  213. *p = d;
  214. p++;
  215. n++;
  216. }
  217. }
  218. #ifdef IS_CDPMAIN_TESTING
  219. if(n!=arraysize) {
  220. sprintf(errstr,"Count of pitch or transposition values does not tally with parse.\n");
  221. return(PROGRAM_ERROR);
  222. }
  223. #endif
  224. final_size = n;
  225. if((*brktable)[0] != 0.0) /* Allow space for a value at time zero, if there isn't one */
  226. final_size = n + 2;
  227. if((*brktable = (double *)realloc((char *)(*brktable),final_size * sizeof(double)))==NULL) {
  228. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate pitch or transposition brktable data.\n");
  229. return(MEMORY_ERROR);
  230. }
  231. if(final_size != n) { /* Force a value at time zero, if there isn't one */
  232. for(m=n-1;m>=0;m--)
  233. (*brktable)[m+2] = (*brktable)[m];
  234. (*brktable)[0] = 0.0;
  235. (*brktable)[1] = (*brktable)[3];
  236. }
  237. *brksize = final_size/2;
  238. return(FINISHED);
  239. }
  240. /*************************** STORE_NUMBERS ***********************/
  241. int store_numbers(char *filename,dataptr dz)
  242. {
  243. double *p, d;
  244. char temp[200], *q;
  245. int n = 0;
  246. FILE *fp;
  247. if((fp = fopen(filename,"r"))==NULL) {
  248. sprintf(errstr,"Failed to open file %s for input.\n",filename);
  249. return(DATA_ERROR);
  250. }
  251. #ifdef IS_CDPMAIN_TESTING
  252. if(dz->numsize<=0) {
  253. sprintf(errstr,"Accounting problem in numfile transfer: store_numbers()\n");
  254. return(PROGRAM_ERROR);
  255. }
  256. if(dz->array_cnt < 1) {
  257. sprintf(errstr,"No double array available for number list: get_numtable_from_framework()\n");
  258. return(PROGRAM_ERROR);
  259. }
  260. if(dz->parray[0] != NULL) {
  261. sprintf(errstr,"Double array for number list already allocated: get_numtable_from_framework()\n");
  262. return(PROGRAM_ERROR);
  263. }
  264. #endif
  265. if((dz->parray[0] = (double *) malloc(dz->numsize * sizeof(double)))==NULL) {
  266. sprintf(errstr,"INSUFFICIENT MEMORY to allocate numbers array.\n");
  267. return(MEMORY_ERROR);
  268. }
  269. p = dz->parray[0];
  270. while(fgets(temp,200,fp)!=NULL) {
  271. q = temp;
  272. while(get_float_from_within_string(&q,&d)) {
  273. #ifdef IS_CDPMAIN_TESTING
  274. if(n >= dz->numsize) {
  275. sprintf(errstr,"Number of input numbers exceeds parsed size: file %s\n",filename);
  276. return(PROGRAM_ERROR);
  277. }
  278. #endif
  279. *p = d;
  280. p++;
  281. n++;
  282. }
  283. }
  284. if(n != dz->numsize) {
  285. sprintf(errstr,"Number of input numbers != parsed size: file %s\n",filename);
  286. return(DATA_ERROR);
  287. }
  288. return(FINISHED);
  289. }
  290. /************************* STORE_WORDLIST *****************************/
  291. int store_wordlist(char *filename,dataptr dz)
  292. {
  293. char temp[200],*p,*q;
  294. int n;
  295. int total_wordcnt = 0;
  296. int wordcnt_in_line;
  297. int line_cnt = 0;
  298. FILE *fp;
  299. #ifdef IS_CDPMAIN_TESTING
  300. if(dz->linecnt <= 0) {
  301. sprintf(errstr,"Accounting problem: get_wordlist()\n");
  302. return(PROGRAM_ERROR);
  303. }
  304. #endif
  305. if((dz->wordstor = (char **)malloc(dz->all_words * sizeof(char *)))==NULL) {
  306. sprintf(errstr,"INSUFFICIENT MEMORY for wordstores.\n");
  307. return(MEMORY_ERROR);
  308. }
  309. for(n=0;n<dz->all_words;n++) /* initialise, for testing and safe freeing */
  310. dz->wordstor[n] = NULL;
  311. if((dz->wordcnt = (int *)malloc(dz->linecnt * sizeof(int)))==NULL) {
  312. sprintf(errstr,"INSUFFICIENT MEMORY for line wordcounts.\n");
  313. return(MEMORY_ERROR);
  314. }
  315. if((fp = fopen(filename,"r"))==NULL) {
  316. sprintf(errstr,"Failed to open file %s for input.\n",filename);
  317. return(DATA_ERROR);
  318. }
  319. while(fgets(temp,200,fp)!=NULL) {
  320. p = temp;
  321. if(is_an_empty_line_or_a_comment(p))
  322. continue;
  323. #ifdef IS_CDPMAIN_TESTING
  324. if(line_cnt >= dz->linecnt) {
  325. sprintf(errstr,"Too many lines found: does not tally with parsing data.\n");
  326. return(PROGRAM_ERROR);
  327. }
  328. #endif
  329. wordcnt_in_line = 0;
  330. while(get_word_from_string(&p,&q)) {
  331. #ifdef IS_CDPMAIN_TESTING
  332. if(total_wordcnt >= dz->all_words) {
  333. sprintf(errstr,"Error in word accounting: store_wordlist_without_comments()\n");
  334. return(PROGRAM_ERROR);
  335. }
  336. #endif
  337. if((dz->wordstor[total_wordcnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  338. sprintf(errstr,"INSUFFICIENT MEMORY for wordstor %d\n",total_wordcnt+1);
  339. return(MEMORY_ERROR);
  340. }
  341. strcpy(dz->wordstor[total_wordcnt],q);
  342. total_wordcnt++;
  343. wordcnt_in_line++;
  344. }
  345. dz->wordcnt[line_cnt] = wordcnt_in_line;
  346. line_cnt++;
  347. }
  348. /* NEW : APRIL 2009 !! */
  349. dz->linecnt = line_cnt;
  350. #ifdef IS_CDPMAIN_TESTING
  351. if(dz->linecnt != line_cnt) {
  352. sprintf(errstr,"Count of lines does not tally with parsing data.\n");
  353. return(PROGRAM_ERROR);
  354. }
  355. if(dz->all_words != total_wordcnt) {
  356. sprintf(errstr,"Count of words does not tally with parsing data.\n");
  357. return(PROGRAM_ERROR);
  358. }
  359. #endif
  360. if(dz->infile->filetype==SNDLIST) { /* reorganise snds in sndlist onto separate lines */
  361. if(dz->linecnt != dz->all_words) {
  362. if((dz->wordcnt = (int *)realloc(dz->wordcnt,dz->all_words * sizeof(int)))==NULL) {
  363. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate word counts.\n");
  364. return(MEMORY_ERROR);
  365. }
  366. dz->linecnt = dz->all_words;
  367. for(n=0;n<dz->linecnt;n++)
  368. dz->wordcnt[n] = 1;
  369. }
  370. }
  371. //TW NOT SURE WHETHER YOU REMOVED fclose(fp) FOR A PURPOSE from the code set you have
  372. //OR I ADDED IT TO THE CODESET MORE RECENTLY, due to its omission throwing up a problem ???
  373. fclose(fp);
  374. return(FINISHED);
  375. }
  376. /*************************** STORE_BRKTABLE ***********************/
  377. int store_brktable(char *filename,dataptr dz)
  378. {
  379. double *p, d, *brktable;
  380. int arraysize;
  381. char temp[200], *q;
  382. int n = 0,m, final_size;
  383. FILE *fp;
  384. if((fp = fopen(filename,"r"))==NULL) {
  385. sprintf(errstr,"Failed to open file %s for input.\n",filename);
  386. return(DATA_ERROR);
  387. }
  388. #ifdef IS_CDPMAIN_TESTING
  389. if(dz->extrabrkno < 0) {
  390. sprintf(errstr,"invalid index for extrabrkno: get_brktable()\n");
  391. return(PROGRAM_ERROR);
  392. }
  393. if(dz->brksize[dz->extrabrkno] <= 0) {
  394. sprintf(errstr,"invalid size for brktable: get_brktable()\n");
  395. return(PROGRAM_ERROR);
  396. }
  397. #endif
  398. arraysize = dz->brksize[dz->extrabrkno] * 2;
  399. if((dz->brk[dz->extrabrkno] = (double*) malloc(arraysize * sizeof(double)))==NULL) {
  400. sprintf(errstr,"INSUFFICIENT MEMORY to store input brktable data.\n");
  401. return(MEMORY_ERROR);
  402. }
  403. brktable = dz->brk[dz->extrabrkno];
  404. p = brktable;
  405. while(fgets(temp,200,fp)!=NULL) {
  406. q = temp;
  407. while(get_float_from_within_string(&q,&d)) {
  408. #ifdef IS_CDPMAIN_TESTING
  409. if(n >= arraysize) {
  410. sprintf(errstr,"Too much data to put in allocated array: Accounting error.\n");
  411. return(PROGRAM_ERROR);
  412. }
  413. #endif
  414. *p = d;
  415. p++;
  416. n++;
  417. }
  418. }
  419. #ifdef IS_CDPMAIN_TESTING
  420. if(n != arraysize) {
  421. sprintf(errstr,"Count of brkfile data does not tally with parse: file %s\n",filename);
  422. return(PROGRAM_ERROR);
  423. }
  424. #endif
  425. if(brktable[0] != 0.0) { /* Allow space for a value at time zero, if there isn't one */
  426. final_size = n + 2;
  427. if((dz->brk[dz->extrabrkno] = (double *)realloc
  428. ((char *)dz->brk[dz->extrabrkno],final_size * sizeof(double)))==NULL) {
  429. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate input brktable data.\n");
  430. return(MEMORY_ERROR);
  431. }
  432. brktable = dz->brk[dz->extrabrkno];
  433. for(m=n-1;m>=0;m--)
  434. brktable[m+2] = brktable[m];
  435. brktable[0] = 0.0;
  436. brktable[1] = brktable[3];
  437. dz->brksize[dz->extrabrkno]++;
  438. }
  439. return(FINISHED);
  440. }
  441. /************************************************************************************/
  442. /************************************************************************************/
  443. /* READING SUBSEQUENT FILES : WHERE DATA NOT KNOWN FROM PARSING PROCESS */
  444. /************************************************************************************/
  445. /************************************************************************************/
  446. /***************************** HANDLE_OTHER_INFILE **************************/
  447. int handle_other_infile(int fileno,char *filename,dataptr dz) /* fileno = 1,2,3.*/
  448. {
  449. int exit_status, current_status;
  450. int wlengthf, arraysize;
  451. double maxval;
  452. int arraycnt;
  453. fileptr fp2 = NULL;
  454. #ifdef IS_CDPMAIN_TESTING
  455. if(fileno < 1 || fileno>dz->infilecnt) {
  456. sprintf(errstr,"Attempted to open infile not accounted for: handle_other_infile()\n");
  457. return(PROGRAM_ERROR);
  458. }
  459. #endif
  460. if((exit_status = open_checktype_getsize_and_compareheader(filename,fileno,&fp2,dz))<0)
  461. return(exit_status);
  462. current_status = exit_status;
  463. switch(dz->input_data_type) {
  464. case(TWO_SNDFILES):
  465. case(MANY_SNDFILES):
  466. case(ONE_OR_MANY_SNDFILES):
  467. //TW NEW
  468. case(ONE_OR_MORE_SNDSYS):
  469. case(SNDFILE_AND_BRKFILE):
  470. case(SNDFILE_AND_UNRANGED_BRKFILE):
  471. case(SNDFILE_AND_DB_BRKFILE):
  472. case(SNDFILE_AND_ENVFILE):
  473. case(TWO_ANALFILES):
  474. case(THREE_ANALFILES):
  475. case(MANY_ANALFILES):
  476. #ifdef IS_CDPMAIN_TESTING
  477. if(current_status!=FINISHED) {
  478. sprintf(errstr,"%s is not a valid data file for this application.\n",filename);
  479. return(USER_ERROR);
  480. }
  481. #endif
  482. break;
  483. case(ANAL_AND_FORMANTS): /* formant data is read in param_preprocess, once buffers setup */
  484. case(PITCH_AND_FORMANTS): /* formant data is read in param_preprocess, once buffers setup */
  485. #ifdef IS_CDPMAIN_TESTING
  486. if(current_status!=FINISHED) {
  487. sprintf(errstr,"%s is not a valid data file for this application.\n",filename);
  488. return(DATA_ERROR);
  489. }
  490. #endif
  491. /* set processing length to min of input files */
  492. if((wlengthf = (dz->insams[fileno]/dz->infile->specenvcnt) - DESCRIPTOR_DATA_BLOKS)<=0) {
  493. sprintf(errstr,"No data in formant file %s\n",filename);
  494. return(DATA_ERROR);
  495. }
  496. dz->wlength = min(dz->wlength,wlengthf);
  497. dz->descriptor_samps = dz->infile->specenvcnt * DESCRIPTOR_DATA_BLOKS ;
  498. if((exit_status = initialise_specenv(&arraycnt,dz))<0)
  499. return(exit_status);
  500. break;
  501. //TW NEW CASE
  502. case(PFE): /* formant data is read in param_preprocess, once buffers setup */
  503. if(fileno==1) {
  504. /* set processing length to min of input files */
  505. if((wlengthf = (dz->insams[fileno]/dz->infile->specenvcnt) - DESCRIPTOR_DATA_BLOKS)<=0) {
  506. sprintf(errstr,"No data in formant file %s\n",filename);
  507. return(DATA_ERROR);
  508. }
  509. dz->wlength = min(dz->wlength,wlengthf);
  510. dz->descriptor_samps = dz->infile->specenvcnt * DESCRIPTOR_DATA_BLOKS;
  511. if((exit_status = initialise_specenv(&arraycnt,dz))<0)
  512. return(exit_status);
  513. }
  514. break;
  515. case(ANAL_WITH_PITCHDATA):
  516. switch(current_status) {
  517. case(FINISHED):
  518. /* pitchdata derived from analdata: hence lengths must be equal */
  519. if((int)(dz->insams[fileno]) != dz->wlength) {
  520. sprintf(errstr,"Pitchfile (%d vals) and analysisfile (%d windows) are not same length\n",dz->insams[fileno],dz->wlength);
  521. return(DATA_ERROR);
  522. }
  523. arraysize = dz->wlength;
  524. if((exit_status = get_pitch_or_transpos_binarydata_from_other_file(arraysize,fileno,&(dz->pitches),fp2,dz))<0)
  525. return(exit_status);
  526. break;
  527. case(CONTINUE):
  528. if((exit_status = getsize_and_get_brkpntdata_from_other_pitch_or_transpos_file
  529. (filename,-2.0,dz->nyquist+1.0,NO_SPECIAL_TYPE,dz))<0)
  530. return(exit_status);
  531. break;
  532. }
  533. break;
  534. case(ANAL_WITH_TRANSPOS):
  535. #ifdef IS_CDPMAIN_TESTING
  536. if(current_status!=FINISHED) {
  537. sprintf(errstr,"%s is not a valid data file for this application.\n",filename);
  538. return(USER_ERROR);
  539. }
  540. #endif
  541. arraysize = max(dz->wlength,dz->insams[1]);
  542. /* transposdata will be adjusted to size of analdata */
  543. if((exit_status = get_pitch_or_transpos_binarydata_from_other_file(arraysize,fileno,&(dz->transpos),fp2,dz))<0)
  544. return(exit_status);
  545. break;
  546. case(PITCH_AND_PITCH):
  547. switch(current_status) {
  548. case(FINISHED): /* THIS file is a binary file, so binary data header available */
  549. if((exit_status = setup_valid_wlength(dz))<0)
  550. return(exit_status);
  551. arraysize = max(dz->wlength,dz->insams[1]);
  552. if((exit_status = get_pitch_or_transpos_binarydata_from_other_file(arraysize,fileno,&(dz->pitches2),fp2,dz))<0)
  553. return(exit_status);
  554. break;
  555. case(CONTINUE): /* Implies input file is NOT a binary file */
  556. if(dz->infile->filetype == TEXTFILE) { /* Implies NEITHER file is a binary file */
  557. if(dz->outfiletype == PITCH_OUT) {
  558. sprintf(errstr,"Can't generate binary output data from exclusively brkpntfile input.\n");
  559. return(DATA_ERROR);
  560. }
  561. maxval = DEFAULT_NYQUIST; /* nyquist is NOT defined */
  562. } else
  563. maxval = dz->nyquist; /* nyquist is defined by 1st input file */
  564. if((exit_status = getsize_and_get_brkpntdata_from_other_pitch_or_transpos_file
  565. (filename,-1.0,maxval,NO_SPECIAL_TYPE,dz))<0)
  566. return(exit_status);
  567. break;
  568. }
  569. /****
  570. if((exit_status = check_for_pitch_zeros(filename,dz->pitches2,dz->wlength))<0)
  571. return(exit_status);
  572. ****/
  573. break;
  574. case(PITCH_AND_TRANSPOS):
  575. case(TRANSPOS_AND_TRANSPOS):
  576. switch(current_status) {
  577. case(FINISHED): /* THIS file is a binary file, so binary data header available */
  578. if((exit_status = setup_valid_wlength(dz))<0)
  579. return(exit_status);
  580. arraysize = max(dz->wlength,dz->insams[1]);
  581. switch(dz->input_data_type) {
  582. case(PITCH_AND_TRANSPOS):
  583. if((exit_status = get_pitch_or_transpos_binarydata_from_other_file
  584. (arraysize,fileno,&(dz->transpos),fp2,dz))<0)
  585. return(exit_status);
  586. break;
  587. case(TRANSPOS_AND_TRANSPOS):
  588. if((exit_status = get_pitch_or_transpos_binarydata_from_other_file
  589. (arraysize,fileno,&(dz->transpos2),fp2,dz))<0)
  590. return(exit_status);
  591. break;
  592. }
  593. break;
  594. case(CONTINUE): /* Implies input file is NOT a binary file */
  595. if(dz->infile->filetype == TEXTFILE) { /* Implies NEITHER file is a binary file */
  596. if(dz->outfiletype == PITCH_OUT) {
  597. sprintf(errstr,"Can't generate binary output data from exclusively brkpntfile input.\n");
  598. return(DATA_ERROR);
  599. }
  600. }
  601. if((exit_status = getsize_and_get_brkpntdata_from_other_pitch_or_transpos_file
  602. (filename,MIN_TRANSPOS,MAX_TRANSPOS,NO_SPECIAL_TYPE,dz))<0)
  603. return(exit_status);
  604. break;
  605. }
  606. break;
  607. case(ALL_FILES):
  608. if(dz->process==INFO_DIFF)
  609. break;
  610. case(ANY_NUMBER_OF_ANY_FILES):
  611. if(dz->process==HOUSE_BUNDLE || dz->process==ADDTOMIX || dz->process==BATCH_EXPAND || dz->process==MIX_MODEL)
  612. break;
  613. default:
  614. sprintf(errstr,"File '%s' has invalid data-type for this application.\n",filename);
  615. return(DATA_ERROR);
  616. }
  617. return(FINISHED);
  618. }
  619. /************************** OPEN_CHECKTYPE_GETSIZE_AND_COMPAREHEADER *****************************/
  620. int open_checktype_getsize_and_compareheader(char *filename,int fileno,fileptr *fp2,dataptr dz)
  621. {
  622. int exit_status;
  623. FILE *fp;
  624. int filetype;
  625. if((dz->ifd[fileno] = sndopenEx(filename,0,CDP_OPEN_RDONLY)) < 0) {
  626. switch(dz->input_data_type) {
  627. case(ANAL_WITH_PITCHDATA):
  628. case(PITCH_AND_PITCH):
  629. case(PITCH_AND_TRANSPOS):
  630. case(TRANSPOS_AND_TRANSPOS):
  631. //TW NEW
  632. return(CONTINUE);
  633. case(ANY_NUMBER_OF_ANY_FILES):
  634. if(dz->process == ADDTOMIX || dz->process == BATCH_EXPAND) {
  635. sprintf(errstr,"cannot open input file %s to read data.\n",filename);
  636. return(DATA_ERROR);
  637. }
  638. return(CONTINUE);
  639. case(SNDFILE_AND_BRKFILE):
  640. case(SNDFILE_AND_UNRANGED_BRKFILE):
  641. if((fp = fopen(filename,"r"))==NULL) { /* test for a brkpnt file */
  642. sprintf(errstr, "Can't open file %s to read data.\n",filename);
  643. return(DATA_ERROR);
  644. }
  645. return read_brkvals_from_other_file(fp,filename,dz);
  646. case(SNDFILE_AND_DB_BRKFILE):
  647. if((fp = fopen(filename,"r"))==NULL) { /* test for a brkpnt file */
  648. sprintf(errstr, "Can't open file %s to read data.\n",filename);
  649. return(DATA_ERROR);
  650. }
  651. return read_dB_brkvals_from_other_file(fp,filename,dz);
  652. case(TWO_SNDFILES):
  653. case(MANY_SNDFILES):
  654. case(ONE_OR_MANY_SNDFILES):
  655. case(SNDFILE_AND_ENVFILE):
  656. case(TWO_ANALFILES):
  657. case(THREE_ANALFILES):
  658. case(MANY_ANALFILES):
  659. case(ANAL_WITH_TRANSPOS):
  660. case(ANAL_AND_FORMANTS):
  661. case(PITCH_AND_FORMANTS):
  662. //TW NEW CASES
  663. case(ONE_OR_MORE_SNDSYS):
  664. case(PFE):
  665. sprintf(errstr,"cannot open input file %s to read data.\n",filename);
  666. return(DATA_ERROR);
  667. case(ALL_FILES):
  668. if(dz->process==INFO_DIFF) {
  669. if((fp = fopen(filename,"r"))==NULL)
  670. sprintf(errstr, "Can't open file %s to read data.\n",filename);
  671. else
  672. sprintf(errstr,"This process does not work with text files [%s].\n",filename);
  673. return(DATA_ERROR);
  674. }
  675. /* fall thro */
  676. case(NO_FILE_AT_ALL):
  677. case(SNDFILES_ONLY):
  678. case(ANALFILE_ONLY):
  679. case(ENVFILES_ONLY):
  680. case(PITCHFILE_ONLY):
  681. case(FORMANTFILE_ONLY):
  682. case(BRKFILES_ONLY):
  683. case(DB_BRKFILES_ONLY):
  684. case(MIXFILES_ONLY):
  685. case(SNDLIST_ONLY):
  686. case(SND_OR_MIXLIST_ONLY):
  687. case(SND_SYNC_OR_MIXLIST_ONLY):
  688. sprintf(errstr,"Should be impossible to call func open_checktype_getsize_and_compareheader()\n");
  689. return(PROGRAM_ERROR);
  690. default:
  691. sprintf(errstr,"open_checktype_getsize_and_compareheader() not defined for this filetype\n");
  692. return(PROGRAM_ERROR);
  693. }
  694. }
  695. if(dz->has_otherfile) {
  696. if((exit_status = set_otherfile_header(dz->ifd[fileno],filename,dz))<0)
  697. return(exit_status);
  698. filetype = dz->otherfile->filetype;
  699. } else {
  700. //TW NEW
  701. // if((exit_status = headcompare_and_update(dz->ifd[fileno],filename,&filetype,fp2,dz))<0)
  702. if((exit_status = headcompare_and_update(dz->ifd[fileno],filename,&filetype,fp2,fileno,dz))<0)
  703. return(exit_status);
  704. }
  705. if((dz->insams[fileno] = sndsizeEx(dz->ifd[fileno]))<0) { /* FIND SIZE OF FILE */
  706. sprintf(errstr, "Can't read size of input file %s.\n"
  707. "open_checktype_getsize_and_compareheader()\n",filename);
  708. return(PROGRAM_ERROR);
  709. }
  710. if((exit_status = check_for_data_in_later_file(filename,filetype,fileno,dz))<0)
  711. return(exit_status);
  712. return(FINISHED);
  713. }
  714. /***************************** HEADCOMPARE_AND_UPDATE *******************************/
  715. //TW NEW
  716. //int headcompare_and_update(int fd,char *filename,int *this_filetype,fileptr *fp2,dataptr dz)
  717. int headcompare_and_update(int fd,char *filename,int *this_filetype,fileptr *fp2,int fileno,dataptr dz)
  718. {
  719. int exit_status;
  720. fileptr fp1 = dz->infile;
  721. double maxamp, maxloc;
  722. int maxrep;
  723. int getmax = 0, getmaxinfo = 0;
  724. infileptr ifp;
  725. if((ifp = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  726. sprintf(errstr,"INSUFFICIENT MEMORY to store data on later infile. (1)\n");
  727. return(MEMORY_ERROR);
  728. }
  729. if((*fp2 = (fileptr)malloc(sizeof(struct fileprops)))==NULL) {
  730. sprintf(errstr,"INSUFFICIENT MEMORY to store data on later infile. (2)\n");
  731. return(MEMORY_ERROR);
  732. }
  733. if((exit_status = readhead(ifp,fd,filename,&maxamp,&maxloc,&maxrep,getmax,getmaxinfo))<0)
  734. return(exit_status);
  735. copy_to_fileptr(ifp,*fp2);
  736. if((exit_status = check_later_filetype_valid_for_process(filename,(*fp2)->filetype,fileno,dz))<0)
  737. return(exit_status);
  738. if(fp1->filetype==TEXTFILE) {
  739. *this_filetype = (*fp2)->filetype;
  740. return(FINISHED);
  741. }
  742. switch(dz->input_data_type) {
  743. case(TWO_SNDFILES):
  744. case(MANY_SNDFILES):
  745. case(ONE_OR_MANY_SNDFILES): /* compare properties common to all short and float files except envfiles */
  746. if((*fp2)->filetype != fp1->filetype) {
  747. sprintf(errstr,"Incompatible file type in input file %s.\n",filename);
  748. return(DATA_ERROR);
  749. }
  750. break;
  751. }
  752. switch(dz->input_data_type) {
  753. /***
  754. compare specifically formant properties : possible future usage *
  755. case(FORMANTS_AND_FORMANTS):
  756. if((*fp2)->specenvcnt != fp1->specenvcnt) {
  757. sprintf(errstr,"Incompatible specenvcnt in input file %s.\n",filename);
  758. return(DATA_ERROR):
  759. }
  760. dz->specenvcnt = fp1->specenvcnt;
  761. * fall thro *
  762. ***/
  763. case(PITCH_AND_FORMANTS): /* compare properties not in analfiles */
  764. case(PITCH_AND_PITCH):
  765. case(PITCH_AND_TRANSPOS):
  766. case(TRANSPOS_AND_TRANSPOS):
  767. case(PITCH_OR_TRANSPOS):
  768. if((*fp2)->origchans != fp1->origchans) {
  769. sprintf(errstr,"Incompatible original-channel-count in input file %s.\n",filename);
  770. return(DATA_ERROR);
  771. }
  772. /* fall thro */
  773. case(ANAL_AND_FORMANTS): /* compare properties common to all float files except envfiles */
  774. case(ANAL_WITH_PITCHDATA):
  775. case(ANAL_WITH_TRANSPOS):
  776. case(TWO_ANALFILES):
  777. case(THREE_ANALFILES):
  778. case(MANY_ANALFILES):
  779. if((*fp2)->origstype != fp1->origstype) {
  780. sprintf(errstr,"Incompatible original-sample-type in input file %s.\n",filename);
  781. return(DATA_ERROR);
  782. }
  783. if((*fp2)->origrate != fp1->origrate) {
  784. sprintf(errstr,"Incompatible original-sample-rate in input file %s.\n",filename);
  785. return(DATA_ERROR);
  786. }
  787. if((*fp2)->arate != fp1->arate) {
  788. sprintf(errstr,"Incompatible analysis-sample-rate in input file %s.\n",filename);
  789. return(DATA_ERROR);
  790. }
  791. if((*fp2)->Mlen != fp1->Mlen) {
  792. sprintf(errstr,"Incompatible analysis-window-length in input file %s.\n",filename);
  793. return(DATA_ERROR);
  794. }
  795. if((*fp2)->Dfac != fp1->Dfac) {
  796. sprintf(errstr,"Incompatible decimation factor in input file %s.\n",filename);
  797. return(DATA_ERROR);
  798. }
  799. /* fall thro */
  800. case(TWO_SNDFILES):
  801. case(MANY_SNDFILES):
  802. case(ONE_OR_MANY_SNDFILES): /* compare properties common to all short and float files except envfiles */
  803. if((*fp2)->srate != fp1->srate) {
  804. sprintf(errstr,"Incompatible sample-rate in input file %s.\n",filename);
  805. return(DATA_ERROR);
  806. }
  807. switch(dz->input_data_type) {
  808. case(TWO_ANALFILES):
  809. case(THREE_ANALFILES):
  810. case(MANY_ANALFILES):
  811. case(TWO_SNDFILES):
  812. case(MANY_SNDFILES):
  813. case(ONE_OR_MANY_SNDFILES):
  814. if((*fp2)->channels != fp1->channels) {
  815. if(!(dz->process == MOD_LOUDNESS) && !(dz->mode == 6)) {
  816. sprintf(errstr,"Incompatible channel-count in input file %s.\n",filename);
  817. return(DATA_ERROR);
  818. }
  819. }
  820. break;
  821. case(ANAL_AND_FORMANTS): /* compare properties and derived properties */
  822. case(ANAL_WITH_PITCHDATA):
  823. case(ANAL_WITH_TRANSPOS):
  824. if((*fp2)->origchans != fp1->channels) {
  825. sprintf(errstr,"Incompatible (original) channel-count in input file %s.\n",filename);
  826. return(DATA_ERROR);
  827. }
  828. }
  829. break;
  830. case(SNDFILE_AND_ENVFILE):
  831. break;
  832. case(ANY_NUMBER_OF_ANY_FILES):
  833. //TW NEW CASE
  834. case(ONE_OR_MORE_SNDSYS):
  835. break;
  836. //TW NEW CASE
  837. case(PFE):
  838. if(fileno==1) {
  839. if((*fp2)->origchans != fp1->origchans) {
  840. sprintf(errstr,"Incompatible original-channel-count in formant file %s.\n",filename);
  841. return(DATA_ERROR);
  842. }
  843. if((*fp2)->origstype != fp1->origstype) {
  844. sprintf(errstr,"Incompatible original-sample-type in formant file %s.\n",filename);
  845. return(DATA_ERROR);
  846. }
  847. if((*fp2)->origrate != fp1->origrate) {
  848. sprintf(errstr,"Incompatible original-sample-rate in formant file %s.\n",filename);
  849. return(DATA_ERROR);
  850. }
  851. if((*fp2)->arate != fp1->arate) {
  852. sprintf(errstr,"Incompatible analysis-sample-rate in formant file %s.\n",filename);
  853. return(DATA_ERROR);
  854. }
  855. if((*fp2)->Mlen != fp1->Mlen) {
  856. sprintf(errstr,"Incompatible analysis-window-length in formant file %s.\n",filename);
  857. return(DATA_ERROR);
  858. }
  859. if((*fp2)->Dfac != fp1->Dfac) {
  860. sprintf(errstr,"Incompatible decimation factor in formant file %s.\n",filename);
  861. return(DATA_ERROR);
  862. }
  863. if((*fp2)->srate != fp1->srate) {
  864. sprintf(errstr,"Incompatible sample-rate in formant file %s.\n",filename);
  865. return(DATA_ERROR);
  866. }
  867. /* NO LONGER POSSIBLE WITH NEW SFSYS
  868. if((*fp2)->stype != fp1->stype) {
  869. sprintf(errstr,"Incompatible sample type in formant file %s.\n",filename);
  870. return(DATA_ERROR);
  871. }
  872. */
  873. fp1->specenvcnt = (*fp2)->specenvcnt;
  874. dz->specenvcnt = fp1->specenvcnt;
  875. } else {
  876. //NEW
  877. if((*fp2)->srate != fp1->srate) {
  878. sprintf(errstr,"Incompatible sample-rate (%d) in envelope file %s (must be %d).\n",
  879. (*fp2)->srate,filename,fp1->srate);
  880. return(DATA_ERROR);
  881. }
  882. //NEW TO HERE
  883. }
  884. *this_filetype = (*fp2)->filetype;
  885. return(FINISHED);
  886. default:
  887. sprintf(errstr,"Inaccessible case in headcompare_and_update()\n");
  888. return(PROGRAM_ERROR);
  889. }
  890. /* ADD ANY ADDITIONAL PROPERTIES TO INFILE PROP LIST */
  891. switch(dz->input_data_type) {
  892. case(PITCH_AND_FORMANTS):
  893. case(ANAL_AND_FORMANTS): /* NB: origchans, if needed, will be set at headwrite stage */
  894. fp1->specenvcnt = (*fp2)->specenvcnt;
  895. dz->specenvcnt = fp1->specenvcnt;
  896. break;
  897. }
  898. *this_filetype = (*fp2)->filetype;
  899. return(FINISHED);
  900. }
  901. /***************************** SET_OTHERFILE_HEADER *******************************
  902. *
  903. * Set up an independent header.
  904. */
  905. int set_otherfile_header(int fd,char *filename,dataptr dz)
  906. {
  907. int exit_status;
  908. double maxamp, maxloc;
  909. int maxrep;
  910. int getmax = 0, getmaxinfo = 0;
  911. infileptr ifp;
  912. if((ifp = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  913. sprintf(errstr,"INSUFFICIENT MEMORY to store data on other file.\n");
  914. return(MEMORY_ERROR);
  915. }
  916. if((exit_status = readhead(ifp,fd,filename,&maxamp,&maxloc,&maxrep,getmax,getmaxinfo))<0)
  917. return(exit_status);
  918. copy_to_fileptr(ifp,dz->otherfile);
  919. if((exit_status = check_later_filetype_valid_for_process(filename,dz->otherfile->filetype,0,dz))<0)
  920. return(exit_status);
  921. return(FINISHED);
  922. }
  923. /***************************** CHECK_LATER_FILETYPE_VALID_FOR_PROCESS *******************************/
  924. //TW NEW
  925. //int check_later_filetype_valid_for_process(char *filename,int file_type,dataptr dz)
  926. int check_later_filetype_valid_for_process(char *filename,int file_type,int fileno,dataptr dz)
  927. {
  928. switch(dz->input_data_type) {
  929. case(NO_FILE_AT_ALL):
  930. case(ALL_FILES):
  931. case(ANY_NUMBER_OF_ANY_FILES):
  932. break;
  933. case(TWO_SNDFILES):
  934. case(MANY_SNDFILES):
  935. case(ONE_OR_MANY_SNDFILES):
  936. if(file_type != SNDFILE) {
  937. sprintf(errstr,"%s is not a sound file.\n",filename);
  938. return(DATA_ERROR);
  939. }
  940. break;
  941. case(SNDFILE_AND_ENVFILE):
  942. if(file_type != ENVFILE) {
  943. sprintf(errstr,"%s is not an envelope file.\n",filename);
  944. return(DATA_ERROR);
  945. }
  946. break;
  947. case(TWO_ANALFILES):
  948. case(THREE_ANALFILES):
  949. case(MANY_ANALFILES):
  950. if(file_type != ANALFILE) {
  951. sprintf(errstr,"%s is not an analysis file.\n",filename);
  952. return(DATA_ERROR);
  953. }
  954. break;
  955. case(PITCH_AND_PITCH):
  956. case(ANAL_WITH_PITCHDATA):
  957. if(file_type != PITCHFILE) {
  958. sprintf(errstr,"%s is not a pitch file.\n",filename);
  959. return(DATA_ERROR);
  960. }
  961. break;
  962. case(PITCH_AND_TRANSPOS):
  963. case(TRANSPOS_AND_TRANSPOS):
  964. case(ANAL_WITH_TRANSPOS):
  965. if(file_type != TRANSPOSFILE) {
  966. sprintf(errstr,"%s is not a transposition file.\n",filename);
  967. return(DATA_ERROR);
  968. }
  969. break;
  970. case(ANAL_AND_FORMANTS):
  971. case(PITCH_AND_FORMANTS):
  972. /* case(FORMANTS_AND_FORMANTS): */
  973. if(file_type != FORMANTFILE) {
  974. sprintf(errstr,"%s is not a formants file.\n",filename);
  975. return(DATA_ERROR);
  976. }
  977. break;
  978. //TW NEW CASE
  979. case(ONE_OR_MORE_SNDSYS):
  980. break;
  981. //TW NEW CASE
  982. case(PFE):
  983. if(fileno==1) {
  984. if(file_type != FORMANTFILE) {
  985. sprintf(errstr,"%s is not a formants file.\n",filename);
  986. return(DATA_ERROR);
  987. }
  988. } else if (file_type != ENVFILE) {
  989. sprintf(errstr,"%s is not an envelope file.\n",filename);
  990. return(DATA_ERROR);
  991. }
  992. break;
  993. default:
  994. sprintf(errstr,"Impossible input_data_type: check_later_filetype_valid_for_process()\n");
  995. return(PROGRAM_ERROR);
  996. }
  997. return(FINISHED);
  998. }
  999. /************************************ CHECK_FOR_DATA_IN_LATER_FILE *****************************************/
  1000. int check_for_data_in_later_file(char *filename,int filetype,int fileno,dataptr dz)
  1001. {
  1002. int clength;
  1003. //TW NEW
  1004. // if(dz->input_data_type == ANY_NUMBER_OF_ANY_FILES) {
  1005. if(dz->input_data_type == ANY_NUMBER_OF_ANY_FILES || dz->input_data_type == ONE_OR_MORE_SNDSYS) {
  1006. if(dz->insams[fileno]==0) {
  1007. sprintf(errstr, "File %s contains no data.\n",filename);
  1008. return(DATA_ERROR);
  1009. }
  1010. return(FINISHED);
  1011. }
  1012. switch(filetype) {
  1013. case(FORMANTFILE):
  1014. #ifdef IS_CDPMAIN_TESTING
  1015. if(fileno >= 2) {
  1016. sprintf(errstr,"check_for_data_in_later_file()\n"
  1017. "only works (so far) for ONE input formantfile accompanying 1st file.\n");
  1018. return(PROGRAM_ERROR);
  1019. }
  1020. if(dz->infile->filetype == SNDFILE || dz->infile->filetype == FORMANTFILE) {
  1021. sprintf(errstr,"check_for_data_in_later_file()\n"
  1022. "Not yet able to deal with FORMANTFILE accompanying FORMANTFILE or SNDFILE.\n");
  1023. return(PROGRAM_ERROR);
  1024. }
  1025. #endif
  1026. if(dz->insams[fileno] <= (int)(DESCRIPTOR_DATA_BLOKS * dz->infile->specenvcnt)) {
  1027. sprintf(errstr, "File %s contains no formant data.\n",filename);
  1028. return(DATA_ERROR);
  1029. }
  1030. switch(dz->infile->filetype) {
  1031. case(FORMANTFILE):
  1032. case(SNDFILE):
  1033. case(ENVFILE):
  1034. break;
  1035. case(ANALFILE):
  1036. clength = (dz->infile->channels)/2; /* channels per window */
  1037. if(dz->infile->specenvcnt > clength+1) {
  1038. sprintf(errstr,"Formant data incompatible with existing channel data.\n"
  1039. "check_for_data_in_later_file()\n");
  1040. return(PROGRAM_ERROR);
  1041. }
  1042. break;
  1043. case(PITCHFILE):
  1044. case(TRANSPOSFILE):
  1045. clength = (dz->infile->origchans)/2; /* channels per window */
  1046. if(dz->infile->specenvcnt > clength+1) {
  1047. sprintf(errstr,"Formant data incompatible with existing channel data.\n"
  1048. "check_for_data_in_later_file()\n");
  1049. return(PROGRAM_ERROR);
  1050. }
  1051. break;
  1052. default:
  1053. sprintf(errstr,"Unknown case for original filetype combining with FORMATFILE\n");
  1054. return(PROGRAM_ERROR);
  1055. }
  1056. break;
  1057. default:
  1058. if(dz->insams[fileno]==0) {
  1059. sprintf(errstr, "File %s contains no data.\n",filename);
  1060. return(DATA_ERROR);
  1061. }
  1062. break;
  1063. }
  1064. return(FINISHED);
  1065. }
  1066. /************************* READ_BRKVALS_FROM_OTHER_FILE *****************************
  1067. *
  1068. * This only reads 0-1 range brkdata from 2nd file of a pair,
  1069. * and only where extrabrkno has been established for this infile_type.
  1070. * i.e. SNDFILE_AND_BRKFILE at Jan 16: 1998.
  1071. */
  1072. int read_brkvals_from_other_file(FILE *fp,char *filename,dataptr dz)
  1073. {
  1074. double maxval = 0.0;
  1075. double minval = 0.0;
  1076. int arraysize = BIGARRAY;
  1077. double *p, lasttime = 0.0;
  1078. int istime = TRUE;
  1079. int n = 0;
  1080. char temp[200], *q;
  1081. int paramno = dz->extrabrkno;
  1082. switch(dz->input_data_type) {
  1083. case(SNDFILE_AND_BRKFILE):
  1084. maxval = 1.0;
  1085. minval = 0.0;
  1086. break;
  1087. case(SNDFILE_AND_UNRANGED_BRKFILE):
  1088. maxval = (double)MAXSAMP;
  1089. minval = 0.0;
  1090. break;
  1091. }
  1092. if(paramno<0) {
  1093. sprintf(errstr,"extrabrk not allocated: read_brkvals_from_other_file()\n");
  1094. return(PROGRAM_ERROR);
  1095. }
  1096. if((dz->brk[paramno] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  1097. sprintf(errstr,"INSUFFICIENT MEMORY for input brktable data.\n");
  1098. return(MEMORY_ERROR);
  1099. }
  1100. p = dz->brk[paramno];
  1101. while(fgets(temp,200,fp)==temp) { /* READ AND TEST BRKPNT VALS */
  1102. q = temp;
  1103. while(get_float_from_within_string(&q,p)) {
  1104. if(istime) {
  1105. if(p==dz->brk[paramno]) {
  1106. if(*p < 0.0) {
  1107. sprintf(errstr,"First timeval(%lf) in brkpntfile %s is less than zero.\n",*p,filename);
  1108. return(DATA_ERROR);
  1109. }
  1110. } else {
  1111. if(*p <= lasttime) {
  1112. sprintf(errstr,"Times (%lf & %lf) in brkpntfile %s are not in increasing order.\n",
  1113. lasttime,*p,filename);
  1114. return(DATA_ERROR);
  1115. }
  1116. }
  1117. lasttime = *p;
  1118. } else {
  1119. if(*p < minval || *p > maxval) {
  1120. sprintf(errstr,"Brkpntfile value (%lf) out of range (%.0lf - %.0lf)\n",*p,minval,maxval); /*RWD 4:12:2003 added *p arg */
  1121. return(DATA_ERROR);
  1122. }
  1123. }
  1124. istime = !istime;
  1125. p++;
  1126. if(++n >= arraysize) {
  1127. arraysize += BIGARRAY;
  1128. if((dz->brk[paramno] = (double *)realloc((char *)(dz->brk[paramno]),arraysize * sizeof(double)))==NULL) {
  1129. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate input brktable data.\n");
  1130. return(MEMORY_ERROR);
  1131. }
  1132. p = dz->brk[paramno] + n;
  1133. }
  1134. }
  1135. }
  1136. if(n < 4) {
  1137. sprintf(errstr,"Not enough data in brkpnt file %s\n",filename);
  1138. return(DATA_ERROR);
  1139. }
  1140. if(ODD(n)) {
  1141. sprintf(errstr,"Data not paired correctly in brkpntfile %s\n",filename);
  1142. return(DATA_ERROR);
  1143. }
  1144. if((dz->brk[paramno] = (double *)realloc((char *)(dz->brk[paramno]),n * sizeof(double)))==NULL) {
  1145. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate input brktable data.\n");
  1146. return(MEMORY_ERROR);
  1147. }
  1148. dz->brksize[paramno] = n/2;
  1149. dz->otherfile->filetype = BRKFILE;
  1150. return(FINISHED);
  1151. }
  1152. /************************* READ_DB_BRKVALS_FROM_OTHER_FILE *****************************
  1153. *
  1154. * This only reads dB range brkdata from 2nd file of a pair, converting vals to normalised range..
  1155. * and only where extrabrkno has been established for this infile_type.
  1156. * i.e. SNDFILE_AND_DB_BRKFILE at Jan 16: 1998.
  1157. */
  1158. int read_dB_brkvals_from_other_file(FILE *fp,char *filename,dataptr dz)
  1159. {
  1160. int exit_status;
  1161. double maxval = 0.0;
  1162. double minval = MIN_DB_ON_16_BIT;
  1163. int arraysize = BIGARRAY;
  1164. double *p, lasttime = 0.0;
  1165. int istime = TRUE;
  1166. int n = 0;
  1167. char temp[200], *q;
  1168. int paramno = dz->extrabrkno;
  1169. if(paramno<0) {
  1170. sprintf(errstr,"extrabrk not allocated: read_dB_brkvals_from_other_file()\n");
  1171. return(PROGRAM_ERROR);
  1172. }
  1173. if((dz->brk[paramno] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  1174. sprintf(errstr,"INSUFFICIENT MEMORY for input brktable data.\n");
  1175. return(MEMORY_ERROR);
  1176. }
  1177. p = dz->brk[paramno];
  1178. while(fgets(temp,200,fp)==temp) { /* READ AND TEST BRKPNT VALS */
  1179. q = temp;
  1180. while(get_float_from_within_string(&q,p)) {
  1181. if(istime) {
  1182. if(p==dz->brk[paramno]) {
  1183. if(*p < 0.0) {
  1184. sprintf(errstr,"First timeval(%lf) in brkpntfile %s is less than zero.\n",*p,filename);
  1185. return(DATA_ERROR);
  1186. }
  1187. } else {
  1188. if(*p <= lasttime) {
  1189. sprintf(errstr,"Times (%lf & %lf) in brkpntfile %s are not in increasing order.\n",
  1190. lasttime,*p,filename);
  1191. return(DATA_ERROR);
  1192. }
  1193. }
  1194. lasttime = *p;
  1195. } else {
  1196. if(*p < minval || *p > maxval) {
  1197. sprintf(errstr,"dB brkpntfile value (%lf) out of range (%.0lf = %.0lf)\n",
  1198. *p,minval,maxval); /*RWD 4:12:2003 added args */
  1199. return(DATA_ERROR);
  1200. }
  1201. if((exit_status = convert_dB_at_or_below_zero_to_gain(p))<0)
  1202. return(exit_status);
  1203. }
  1204. istime = !istime;
  1205. p++;
  1206. if(++n >= arraysize) {
  1207. arraysize += BIGARRAY;
  1208. if((dz->brk[paramno] = (double *)realloc((char *)(dz->brk[paramno]),arraysize * sizeof(double)))==NULL) {
  1209. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate input brktable data.\n");
  1210. return(MEMORY_ERROR);
  1211. }
  1212. p = dz->brk[paramno] + n;
  1213. }
  1214. }
  1215. }
  1216. if(n < 4) {
  1217. sprintf(errstr,"No data in brkpnt file %s\n",filename);
  1218. return(DATA_ERROR);
  1219. }
  1220. if(ODD(n)) {
  1221. sprintf(errstr,"Data not paired correctly in brkpntfile %s\n",filename);
  1222. return(DATA_ERROR);
  1223. }
  1224. if((dz->brk[paramno] = (double *)realloc((char *)(dz->brk[paramno]),n * sizeof(double)))==NULL) {
  1225. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate input brktable data.\n");
  1226. return(MEMORY_ERROR);
  1227. }
  1228. dz->brksize[paramno] = n/2;
  1229. dz->otherfile->filetype = DB_BRKFILE;
  1230. return(FINISHED);
  1231. }
  1232. /********************************** SETUP_VALID_WLENGTH ************************************/
  1233. int setup_valid_wlength(dataptr dz)
  1234. {
  1235. if(dz->infile->filetype == TEXTFILE) {
  1236. if(dz->duration <= 0.0) {
  1237. sprintf(errstr,"duration of first file not set: setup_valid_wlength()\n");
  1238. return(PROGRAM_ERROR);
  1239. }
  1240. dz->wlength = round(dz->duration/dz->frametime); /* wlength of file1 */
  1241. }
  1242. dz->wlength = min(dz->wlength,dz->insams[1]);
  1243. return(FINISHED);
  1244. }
  1245. /********************* GET_PITCH_OR_TRANSPOS_BINARYDATA_FROM_OTHER_FILE *************************/
  1246. int get_pitch_or_transpos_binarydata_from_other_file(int max_arraysize,int fileno,float **thisdata,fileptr fp2,dataptr dz)
  1247. {
  1248. int exit_status;
  1249. int /*seccnt,*/ samps_to_read, samps_read, actual_arraysize;
  1250. float lastval;
  1251. fileptr fp1 = dz->infile;
  1252. #ifdef IS_CDPMAIN_TESTING
  1253. if(fileno >= 2) {
  1254. sprintf(errstr,"get_pitch_or_transpos_binarydata_from_other_file() does not work YET for > 2 infiles\n");
  1255. return(PROGRAM_ERROR);
  1256. }
  1257. #endif
  1258. samps_to_read = max_arraysize;
  1259. max_arraysize = samps_to_read;
  1260. if((*thisdata = (float *)malloc((size_t)(samps_to_read * sizeof(float))))==NULL) {
  1261. sprintf(errstr,"INSUFFICIENT MEMORY for 2nd pitch or transposition array.\n");
  1262. return(MEMORY_ERROR);
  1263. }
  1264. if((samps_read = fgetfbufEx((*thisdata), samps_to_read,dz->ifd[fileno],0))<0) {
  1265. sprintf(errstr,"Sound read error.\n");
  1266. return(SYSTEM_ERROR);
  1267. }
  1268. if(samps_read != dz->insams[fileno]) {
  1269. sprintf(errstr,"Problem reading data: get_pitch_or_transpos_binarydata_from_other_file()\n");
  1270. return(PROGRAM_ERROR);
  1271. }
  1272. actual_arraysize = dz->insams[fileno];
  1273. switch(dz->input_data_type) {
  1274. case(PITCH_AND_PITCH):
  1275. if(dz->infile->filetype!=TEXTFILE) /* force data to be min length of two input files */
  1276. actual_arraysize = min(actual_arraysize,dz->wlength);
  1277. else {
  1278. dz->nyquist = (double)fp2->origrate/2.0;
  1279. dz->wlength = actual_arraysize;
  1280. }
  1281. //TW NEW
  1282. // if((exit_status = test_brkvals(-1.0,dz->nyquist,*thisdata,actual_arraysize))<0)
  1283. if((exit_status = test_brkvals(NOT_SOUND,dz->nyquist,*thisdata,actual_arraysize))<0)
  1284. return(exit_status);
  1285. if(dz->infile->filetype==TEXTFILE) { /* 1st input is brkpnt, 2nd is binary */
  1286. if((exit_status = inform_infile_structure(fp1,fp2,dz))<0)
  1287. return(exit_status);
  1288. if((exit_status = convert_brkpntdata_to_window_by_window_array
  1289. (dz->temp,dz->tempsize,&dz->pitches,dz->wlength,dz->frametime))<0)
  1290. return(exit_status);
  1291. }
  1292. break;
  1293. case(PITCH_AND_TRANSPOS):
  1294. if(dz->infile->filetype!=TEXTFILE) /* force data to be min length of two input files */
  1295. actual_arraysize = min(actual_arraysize,dz->wlength);
  1296. else
  1297. dz->wlength = actual_arraysize;
  1298. if((exit_status = test_brkvals(MIN_TRANSPOS,MAX_TRANSPOS,*thisdata,actual_arraysize))<0)
  1299. return(exit_status);
  1300. if(dz->infile->filetype==TEXTFILE) { /* 1st input is brkpnt, 2nd is binary */
  1301. if((exit_status = inform_infile_structure(fp1,fp2,dz))<0)
  1302. return(exit_status);
  1303. if((exit_status = convert_brkpntdata_to_window_by_window_array
  1304. (dz->temp,dz->tempsize,&dz->pitches,dz->wlength,dz->frametime))<0)
  1305. return(exit_status);
  1306. }
  1307. break;
  1308. case(TRANSPOS_AND_TRANSPOS):
  1309. if(dz->infile->filetype!=TEXTFILE) /* force data to be min length of two input files */
  1310. actual_arraysize = min(actual_arraysize,dz->wlength);
  1311. else
  1312. dz->wlength = actual_arraysize;
  1313. if((exit_status = test_brkvals(MIN_TRANSPOS,MAX_TRANSPOS,*thisdata,actual_arraysize))<0)
  1314. return(exit_status);
  1315. if(dz->infile->filetype==TEXTFILE) { /* 1st input is brkpnt, 2nd is binary */
  1316. if((exit_status = inform_infile_structure(fp1,fp2,dz))<0)
  1317. return(exit_status);
  1318. if((exit_status = convert_brkpntdata_to_window_by_window_array
  1319. (dz->temp,dz->tempsize,&dz->transpos,dz->wlength,dz->frametime))<0)
  1320. return(exit_status);
  1321. }
  1322. break;
  1323. case(ANAL_WITH_TRANSPOS):
  1324. /* force data to be length of 1st input files */
  1325. lastval = (*thisdata)[actual_arraysize-1];
  1326. #ifdef IS_CDPMAIN_TESTING
  1327. if(max_arraysize < dz->wlength) {
  1328. sprintf(errstr,"Error in establishing arraysize: get_pitch_or_transpos_binarydata_from_other_file()\n");
  1329. return(PROGRAM_ERROR);
  1330. }
  1331. #endif
  1332. while(actual_arraysize < dz->wlength) {
  1333. (*thisdata)[actual_arraysize] = lastval;
  1334. actual_arraysize++;
  1335. }
  1336. break;
  1337. case(ANAL_WITH_PITCHDATA):
  1338. /* data is length of 1st input files */
  1339. actual_arraysize = max_arraysize;
  1340. break;
  1341. default:
  1342. sprintf(errstr,"Invalid case in get_pitch_or_transpos_binarydata_from_other_file()\n");
  1343. return(PROGRAM_ERROR);
  1344. }
  1345. if((*thisdata = (float *)realloc((char *)(*thisdata),(actual_arraysize + 1) * sizeof(float)))==NULL) {
  1346. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate 2nd table of pitch or transposition data.\n");
  1347. return(MEMORY_ERROR);
  1348. }
  1349. (*thisdata)[actual_arraysize] = 0.0f; /* SAFETY POSITION */
  1350. return(FINISHED);
  1351. }
  1352. /********************** GETSIZE_AND_GET_BRKPNTDATA_FROM_OTHER_PITCH_OR_TRANSPOS_FILE *******************/
  1353. int getsize_and_get_brkpntdata_from_other_pitch_or_transpos_file
  1354. (char *filename,double minval, double maxval,int which_type, dataptr dz)
  1355. {
  1356. int exit_status;
  1357. FILE *fp;
  1358. double *brktable = NULL;
  1359. /*int init = 1, istime = 1;*/
  1360. int /* n = 0,*/ brksize;
  1361. int wlen;
  1362. float timestep;
  1363. if((fp = fopen(filename,"r"))==NULL) {
  1364. sprintf(errstr, "Can't open brkpntfile %s to read data.\n",filename);
  1365. return(DATA_ERROR);
  1366. }
  1367. if((exit_status=read_and_test_pitch_or_transposition_brkvals
  1368. (fp,filename,&brktable,&brksize,which_type,minval,maxval))<0) {
  1369. if(brktable != NULL)
  1370. free(brktable);
  1371. return(exit_status);
  1372. }
  1373. if(fclose(fp)<0) {
  1374. fprintf(stdout,"WARNING: Failed to close file %s.\n",filename);
  1375. fflush(stdout);
  1376. }
  1377. switch(dz->input_data_type) {
  1378. #ifdef IS_CDPMAIN_TESTING
  1379. case(ANAL_WITH_TRANSPOS):
  1380. sprintf(errstr,"Inaccesible case: getsize_and_get_brkpntdata_from_other_pitch_or_transpos_file()\n");
  1381. return(PROGRAM_ERROR);
  1382. #endif
  1383. case(ANAL_WITH_PITCHDATA):
  1384. break; /* files are same length: so minwindowlength = wlength */
  1385. default:
  1386. if((exit_status = establish_minwindowlength_or_minduration_in_secs(brktable,brksize,filename,dz))<0) {
  1387. free(brktable);
  1388. return(exit_status);
  1389. }
  1390. break;
  1391. }
  1392. if(dz->wlength==0) { /* Neither input binary: use default_frametime & convert both files to bin form */
  1393. wlen = round(dz->duration/DEFAULT_FRAMETIME);
  1394. timestep = DEFAULT_FRAMETIME;
  1395. } else {
  1396. wlen = dz->wlength;
  1397. timestep = dz->frametime;
  1398. }
  1399. switch(dz->input_data_type) {
  1400. case(ANAL_WITH_PITCHDATA): /* First file is binary: convert second */
  1401. if((exit_status = convert_brkpntdata_to_window_by_window_array(brktable,brksize,&dz->pitches,wlen,timestep))<0) {
  1402. free(brktable);
  1403. return(exit_status);
  1404. }
  1405. break;
  1406. case(PITCH_AND_PITCH):
  1407. if(dz->wlength==0) { /* Neither input is binary: convert first file */
  1408. if((exit_status = convert_brkpntdata_to_window_by_window_array
  1409. (dz->temp,dz->tempsize,&dz->pitches,wlen,timestep))<0)
  1410. return(exit_status);
  1411. } /* Convert second file */
  1412. if((exit_status = convert_brkpntdata_to_window_by_window_array(brktable,brksize,&(dz->pitches2),wlen,timestep))<0) {
  1413. free(brktable);
  1414. return(exit_status);
  1415. }
  1416. break;
  1417. case(PITCH_AND_TRANSPOS):
  1418. if(dz->wlength==0) { /* Neither input is binary: convert first file */
  1419. if((exit_status = convert_brkpntdata_to_window_by_window_array
  1420. (dz->temp,dz->tempsize,&dz->pitches,wlen,timestep))<0)
  1421. return(exit_status);
  1422. } /* Convert second file */
  1423. if((exit_status = convert_brkpntdata_to_window_by_window_array
  1424. (brktable,brksize,&dz->transpos,wlen,timestep))<0) {
  1425. free(brktable);
  1426. return(exit_status);
  1427. }
  1428. break;
  1429. case(TRANSPOS_AND_TRANSPOS):
  1430. if(dz->wlength==0) { /* Neither input is binary: convert first file */
  1431. if((exit_status = convert_brkpntdata_to_window_by_window_array
  1432. (dz->temp,dz->tempsize,&dz->transpos,wlen,timestep))<0)
  1433. return(exit_status);
  1434. } /* Convert second file */
  1435. if((exit_status = convert_brkpntdata_to_window_by_window_array
  1436. (brktable,brksize,&dz->transpos2,wlen,timestep))<0) {
  1437. free(brktable);
  1438. return(exit_status);
  1439. }
  1440. break;
  1441. }
  1442. free(brktable);
  1443. return(FINISHED);
  1444. }
  1445. /************************* ESTABLISH_MINWINDOWLENGTH_OR_MINDURATION_IN_SECS *****************************/
  1446. int establish_minwindowlength_or_minduration_in_secs(double *brktable,int brksize,char *filename,dataptr dz)
  1447. {
  1448. int exit_status;
  1449. double thisduration;
  1450. int thislen;
  1451. if((exit_status = establish_duration_in_secs(&thisduration,brktable,brksize,filename))<0)
  1452. return(exit_status);
  1453. if(dz->infile->filetype == TEXTFILE) { /* 1st file was a brkpntfile */
  1454. #ifdef IS_CDPMAIN_TESTING
  1455. if(dz->duration <= 0.0) {
  1456. sprintf(errstr,"duration not set: establish_minwindowlength_or_minduration_in_secs()\n");
  1457. return(PROGRAM_ERROR);
  1458. }
  1459. #endif
  1460. dz->duration = min(thisduration,dz->duration);
  1461. }
  1462. /* both files are brkpnt: hence wlength remains zero */
  1463. else { /* 1st file was a binary file: so frametime is established */
  1464. #ifdef IS_CDPMAIN_TESTING
  1465. if(dz->wlength <=0) {
  1466. sprintf(errstr,"wlength not set: establish_minwindowlength_or_minduration_in_secs()\n");
  1467. return(PROGRAM_ERROR);
  1468. }
  1469. #endif
  1470. thislen = round(thisduration/dz->frametime);
  1471. dz->wlength = min(dz->wlength,thislen);
  1472. }
  1473. return(FINISHED);
  1474. }
  1475. /************************* ESTABLISH_DURATION_IN_SECS *****************************/
  1476. int establish_duration_in_secs(double *duration,double *brktable,int brksize,char *filename)
  1477. {
  1478. if((*duration = *(brktable + (brksize * 2) - 2))<=0.0) {
  1479. sprintf(errstr,"No significant data in file %s\n",filename);
  1480. return(DATA_ERROR);
  1481. }
  1482. return(FINISHED);
  1483. }
  1484. /************************ CHECK_FOR_PITCH_ZEROS ***************************/
  1485. #ifdef NOTDEF
  1486. int check_for_pitch_zeros(char *filename,float *pitcharray,int wlen)
  1487. {
  1488. int n;
  1489. for(n=0;n<wlen;n++) {
  1490. if(pitcharray[n] < FLTERR) {
  1491. sprintf(errstr,"File %s contains unpitched windows: cannot proceed.\n",filename);
  1492. return(DATA_ERROR);
  1493. }
  1494. }
  1495. return(FINISHED);
  1496. }
  1497. #endif
  1498. /******************************* TEST_BRKVALS ****************************/
  1499. int test_brkvals(double minval,double maxval,float *floatarray,int arraysize)
  1500. {
  1501. float *p = floatarray;
  1502. float *pend = floatarray + arraysize;
  1503. while(p < pend) {
  1504. if(*p < minval) {
  1505. sprintf(errstr,"Value (%lf) too small (minval = %lf) in further file.\n",*p,minval);
  1506. return(DATA_ERROR);
  1507. }
  1508. if(*p > maxval) {
  1509. sprintf(errstr,"Value (%lf) too large (maxval = %lf) in further file.\n",*p,maxval);
  1510. return(DATA_ERROR);
  1511. }
  1512. p++;
  1513. }
  1514. return(FINISHED);
  1515. }
  1516. /******************************* INFORM_INFILE_STRUCTURE ****************************/
  1517. int inform_infile_structure(fileptr fp1,fileptr fp2,dataptr dz)
  1518. {
  1519. if(dz->infilecnt > 2) {
  1520. sprintf(errstr,"Input processes for 1 textfile & >1 nontextfile are NOT DEFINED\n"
  1521. "Hence 2 later nontextfiles are not header_compared\n");
  1522. return(PROGRAM_ERROR);
  1523. }
  1524. switch(dz->input_data_type) {
  1525. case(PITCH_AND_PITCH):
  1526. case(PITCH_AND_TRANSPOS):
  1527. case(TRANSPOS_AND_TRANSPOS):
  1528. fp1->filetype = fp2->filetype; /* Setup infile properties here */
  1529. fp1->origchans = fp2->origchans;
  1530. fp1->origstype = fp2->origstype;
  1531. fp1->origrate = fp2->origrate;
  1532. fp1->arate = fp2->arate;
  1533. fp1->Mlen = fp2->Mlen;
  1534. fp1->Dfac = fp2->Dfac;
  1535. fp1->srate = fp2->srate;
  1536. fp1->channels = fp2->channels;
  1537. fp1->stype = fp2->stype;
  1538. /* Setup other header-based parameters here */
  1539. dz->nyquist = fp1->origrate/2.0;
  1540. dz->frametime = (float)(1.0/fp1->arate);
  1541. break;
  1542. default:
  1543. sprintf(errstr,"No process defined taking this textfiletype and this sndfiletype.\n");
  1544. return(PROGRAM_ERROR);
  1545. }
  1546. return(FINISHED);
  1547. }