sort.c 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286
  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. /* RWD floats version */
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <structures.h>
  25. #include <tkglobals.h>
  26. #include <globcon.h>
  27. #include <cdpmain.h>
  28. #include <house.h>
  29. #include <modeno.h>
  30. #include <pnames.h>
  31. #include <flags.h>
  32. #include <filetype.h>
  33. #include <sfsys.h>
  34. #include <string.h>
  35. /**
  36. #include <logic.h>
  37. #include <limits.h>
  38. #include <math.h>
  39. **/
  40. #define MAXTYPES (512)
  41. #define IS_MONO (1)
  42. #define IS_STEREO (2)
  43. #define IS_QUAD (3)
  44. #define IS_ANAL (4)
  45. #define IS_PITCH (5)
  46. #define IS_TRANSPOS (6)
  47. #define IS_FMNT (7)
  48. #define IS_ENV (8)
  49. static int compare_properties_for_bundling(fileptr fp1,infileptr fp2);
  50. static int read_and_sort_properties(char *infilename,dataptr dz);
  51. static int do_srates(char *infilename,char *thisfilename,
  52. char **file48,char **file44,char **file32,char **file24,char **file22,char **file16,
  53. int *is_file48,int *is_file44,int *is_file32,int *is_file24,int *is_file2,int *is_file16,
  54. FILE **fp48,FILE **fp44,FILE **fp32,FILE **fp24,FILE **fp22,FILE **fp16,dataptr dz);
  55. static void do_rogues(char *infilename,int *a_srate,dataptr dz);
  56. static int read_srate(char *infilename,dataptr dz);
  57. static int read_channels(char *infilename,dataptr dz);
  58. static void get_length(char *infilename,dataptr dz);
  59. static int do_lenths(char *infilename,char *thisfilename,char **namestore,char ***lstore,
  60. int *namestoresize,int *lcnt,double *sortlens,dataptr dz);
  61. static int create_lfile(char *infilename,char **otherfile,char ***lstore,double *sortlens,int *lcnt,dataptr dz);
  62. static int create_ofile(char *infilename,char **otherfile,int cnt,
  63. char ***lstore,double *lenstore,int *posstore,dataptr dz);
  64. static int do_types(char *infilename, char *thisfilename,char **monofile,char **stereofile,char **quadfile,
  65. char **analfile,char **pitchfile, char **transfile,char **formantfile,char **envfile,char **otherfile,
  66. int *is_mono_list,int *is_stereo_list,int *is_quad_list,int *is_anal_list,int *is_pitch_list,
  67. int *is_trans_list,int *is_fmnt_list,int *is_env_list,int *is_other_list,
  68. FILE **fpm,FILE **fps,FILE **fpa,FILE **fpp,FILE **fpt,FILE **fpf,FILE **fpe,FILE **fpo,FILE **fpq,dataptr dz);
  69. //TW REVISED
  70. static int output_lenths(char *infilename,char **otherfile,
  71. char ***lstore,double *sortlens,int *lcnt,dataptr dz);
  72. static void output_srates(int is_file48,int is_file44,int is_file32,int is_file24,int is_file22,int is_file16,
  73. char *file48,char *file44,char *file32,char *file24,char *file22,char *file16);
  74. static void output_types(char *infilename,int is_mono_list,int is_stereo_list,int is_quad_list,
  75. int is_anal_list,int is_pitch_list,
  76. int is_trans_list,int is_fmnt_list,int is_env_list,int is_other_list,
  77. char *monofile,char *stereofile,char *quadfile,char *analfile,char *pitchfile,char *transfile,
  78. char *formantfile,char *envfile,char *otherfile);
  79. static void strip_extension(char *filename);
  80. static int do_order(char *infilename,char *thisfilename,char **namestore,double **lenstore,int **posstore,
  81. char ****lstore,int *fileno,int *namestoresize,dataptr dz);
  82. static int output_order(char *infilename,char **otherfile,
  83. int *posstore,double *lenstore,char ***lstore,int cnt,dataptr dz);
  84. static int read_special_type(dataptr dz);
  85. static int filename_extension_is_not_sound(char *filename);
  86. int outfcnt = 0;
  87. /************************** DO_BUNDLE *****************************/
  88. int do_bundle(dataptr dz)
  89. {
  90. int exit_status;
  91. int got_sndfile = FALSE, n, OK;
  92. int filetype = dz->infile->filetype;
  93. fileptr fp1 = dz->infile;
  94. double maxamp, maxloc;
  95. int maxrep;
  96. int getmax = 0, getmaxinfo = 0;
  97. infileptr ifp;
  98. if((ifp = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  99. sprintf(errstr,"INSUFFICIENT MEMORY to store data on files.\n");
  100. return(MEMORY_ERROR);
  101. }
  102. for(n=0;n<dz->infilecnt;n++) {
  103. if(!strcmp(dz->wordstor[n],dz->wordstor[dz->all_words-1])) {
  104. sprintf(errstr,"Name of out-listfile [%s] cannot be included in the listing!!\n",dz->wordstor[n]);
  105. return(DATA_ERROR);
  106. }
  107. }
  108. if(!is_a_text_input_filetype(filetype))
  109. got_sndfile = TRUE;
  110. if(got_sndfile || dz->mode==BUNDLE_ALL) {
  111. sprintf(errstr,"BUNDLED %s\n",dz->wordstor[0]);
  112. print_outmessage(errstr);
  113. fprintf(dz->fp,"%s\n",dz->wordstor[0]);
  114. }
  115. for(n=1;n<dz->infilecnt;n++) {
  116. for(;;) {
  117. OK = FALSE;
  118. if(dz->mode==BUNDLE_ALL) {
  119. OK = TRUE; /* list any file */
  120. break;
  121. } else if((dz->ifd[n] = sndopenEx(dz->wordstor[n],0,CDP_OPEN_RDONLY)) < 0)
  122. break; /* else if non-text file, break */
  123. if(dz->mode==BUNDLE_NONTEXT) {
  124. OK = TRUE; /* if any non-text file OK, break */
  125. break;
  126. }
  127. if(!got_sndfile) {
  128. got_sndfile = TRUE;
  129. if((exit_status = readhead(ifp,dz->ifd[n],dz->wordstor[n],&maxamp,&maxloc,&maxrep,getmax,getmaxinfo))<0)
  130. return(exit_status);
  131. filetype = ifp->filetype;
  132. copy_to_fileptr(ifp,fp1);
  133. OK = TRUE; /* 1st non-text file is always OK, break */
  134. break;
  135. }
  136. if((exit_status = readhead(ifp,dz->ifd[n],dz->wordstor[n],&maxamp,&maxloc,&maxrep,getmax,getmaxinfo))<0)
  137. return(exit_status);
  138. if(ifp->filetype!=filetype) /* If files NOT of same type, break */
  139. break;
  140. if(dz->mode==BUNDLE_TYPE) {
  141. OK = TRUE; /* if any file of same type OK, break */
  142. break;
  143. }
  144. if(compare_properties_for_bundling(fp1,ifp)==CONTINUE)
  145. break; /* if properties incompatible, break */
  146. if(dz->mode==BUNDLE_SRATE) {
  147. OK = TRUE; /* if any file with same props OK, break */
  148. break;
  149. } /* if files have same chancnt, set OK for BUNDLE_CHAN */
  150. if(fp1->channels==ifp->channels)
  151. OK = TRUE;
  152. break;
  153. }
  154. if(OK) {
  155. sprintf(errstr,"BUNDLED %s\n",dz->wordstor[n]);
  156. print_outmessage(errstr);
  157. fprintf(dz->fp,"%s\n",dz->wordstor[n]);
  158. }
  159. }
  160. fflush(stdout);
  161. free(ifp);
  162. return(FINISHED);
  163. }
  164. /************************** COMPARE_PROPERTIES_FOR_BUNDLING *****************************/
  165. int compare_properties_for_bundling(fileptr fp1,infileptr fp2)
  166. {
  167. switch(fp1->filetype) {
  168. case(PITCHFILE): /* compare properties not in analfiles */
  169. case(FORMANTFILE):
  170. case(TRANSPOSFILE):
  171. if(fp2->origchans != fp1->origchans)
  172. return(CONTINUE);
  173. /* fall thro */
  174. case(ANALFILE): /* compare properties common to all float files except envfiles */
  175. if(fp2->origstype != fp1->origstype)
  176. return(CONTINUE);
  177. if(fp2->origrate != fp1->origrate)
  178. return(CONTINUE);
  179. if(fp2->arate != fp1->arate)
  180. return(CONTINUE);
  181. if(fp2->Mlen != fp1->Mlen)
  182. return(CONTINUE);
  183. if(fp2->Dfac != fp1->Dfac)
  184. return(CONTINUE);
  185. /* fall thro */
  186. case(SNDFILE):
  187. // TW MOVED THIS HERE : June 2004
  188. if(fp2->channels != fp1->channels)
  189. return(CONTINUE);
  190. if(fp2->srate != fp1->srate)
  191. return(CONTINUE);
  192. if(fp2->stype != fp1->stype)
  193. return(CONTINUE);
  194. break;
  195. case(ENVFILE):
  196. if(fp2->window_size != fp1->window_size)
  197. return(CONTINUE);
  198. break;
  199. default:
  200. sprintf(errstr,"Inaccessible case in compare_properties_for_bundling()\n");
  201. return(PROGRAM_ERROR);
  202. }
  203. return(FINISHED);
  204. }
  205. /**************************** DO_FILE_SORTING *****************************/
  206. int do_file_sorting(dataptr dz)
  207. {
  208. int exit_status;
  209. int n;
  210. int a_srate = 0;
  211. double sum;
  212. int infilecnt = dz->all_words-1;
  213. int fileno = 0, namestoresize = 0;
  214. char *filename = dz->wordstor[infilecnt]; /* name of input list file */
  215. char *monofile=NULL, *stereofile = NULL, *analfile = NULL, *quadfile = NULL;
  216. char *pitchfile = NULL, *transfile = NULL, *formantfile = NULL;
  217. char *envfile = NULL, *otherfile = NULL, *namestore = NULL;
  218. int *posstore = NULL;
  219. int *lcnt = NULL;
  220. char ***lstore = NULL;
  221. double *lenstore = NULL;
  222. double *sortlens = NULL;
  223. #ifdef NOTDEF
  224. char *file48 = ENDOFSTR, *file44 = ENDOFSTR, *file32 = ENDOFSTR;
  225. char *file24 = ENDOFSTR, *file22 = ENDOFSTR, *file16 = ENDOFSTR;
  226. #else
  227. char *file48 = NULL, *file44 = NULL, *file32 = NULL;
  228. char *file24 = NULL, *file22 = NULL, *file16 = NULL;
  229. #endif
  230. int is_file48=FALSE, is_file44=FALSE, is_file32=FALSE, is_file24=FALSE, is_file22=FALSE, is_file16=FALSE;
  231. int is_mono_list=FALSE, is_stereo_list=FALSE,is_quad_list=FALSE, is_anal_list=FALSE,is_pitch_list=FALSE;
  232. int is_trans_list=FALSE, is_fmnt_list=FALSE, is_env_list=FALSE, is_other_list=FALSE;
  233. FILE *fp48 = NULL, *fp44 = NULL, *fp32 = NULL, *fp24 = NULL, *fp22 = NULL, *fp16 = NULL,
  234. *fpm = NULL, *fps = NULL, *fpa = NULL, *fpp = NULL, *fpt = NULL, *fpf = NULL, *fpe = NULL, *fpo = NULL, *fpq = NULL;
  235. char *p;
  236. int done_errmsg = 0;
  237. switch(dz->mode) {
  238. case(BY_DURATION):
  239. case(BY_LOG_DUR):
  240. if((lcnt = (int *)malloc((dz->iparam[SORT_LENCNT]+1) * sizeof(int)))==NULL) {
  241. sprintf(errstr,"INSUFFICIENT MEMORY for lcnt store.\n");
  242. return(MEMORY_ERROR);
  243. }
  244. if((sortlens = (double *)malloc(dz->iparam[SORT_LENCNT] * sizeof(double)))==NULL) {
  245. sprintf(errstr,"INSUFFICIENT MEMORY for lens store.\n");
  246. return(MEMORY_ERROR);
  247. }
  248. sum = dz->param[SORT_SMALL];
  249. for(n=0;n<dz->iparam[SORT_LENCNT];n++) {
  250. lcnt[n] = 0;
  251. sortlens[n] = sum;
  252. if(dz->mode==BY_LOG_DUR)
  253. sum *= dz->param[SORT_STEP];
  254. else
  255. sum += dz->param[SORT_STEP];
  256. }
  257. lcnt[dz->iparam[SORT_LENCNT]] = 0;
  258. sortlens[dz->iparam[SORT_LENCNT]-1] = dz->param[SORT_LARGE];
  259. dz->iparam[SORT_LENCNT]++;
  260. /* fall thro */
  261. case(IN_DUR_ORDER):
  262. if((lstore = (char ***)malloc((dz->iparam[SORT_LENCNT]+1) * sizeof(char **)))==NULL) {
  263. sprintf(errstr,"INSUFFICIENT MEMORY for length store.\n");
  264. return(MEMORY_ERROR);
  265. }
  266. for(n=0;n<dz->iparam[SORT_LENCNT]+1;n++) {
  267. // AVOID realloc
  268. if((lstore[n] = (char **)malloc(infilecnt * sizeof(char *)))==NULL) {
  269. sprintf(errstr,"INSUFFICIENT MEMORY for length store %d.\n",n+1);
  270. return(MEMORY_ERROR);
  271. }
  272. }
  273. break;
  274. }
  275. strip_extension(filename);
  276. if(sloom && (dz->mode == BY_FILETYPE || dz->mode == BY_SRATE)) {
  277. p = filename + strlen(filename) - 1; /* Strip trailing zero from generic tempfilename */
  278. *p = ENDOFSTR;
  279. }
  280. for(n=0;n<infilecnt;n++) {
  281. if(!strcmp(dz->wordstor[infilecnt],dz->wordstor[n])) {
  282. sprintf(errstr,"The name of the listfile cannot be included in the listing!!\n");
  283. return(DATA_ERROR);
  284. }
  285. }
  286. // AVOID realloc
  287. for(n=0;n<infilecnt;n++)
  288. namestoresize += strlen(dz->wordstor[n]) + 1;
  289. if((namestore = (char *)malloc(namestoresize * sizeof(char)))==NULL) {
  290. sprintf(errstr,"INSUFFICIENT MEMORY for name store.\n");
  291. return(MEMORY_ERROR);
  292. }
  293. namestoresize = 0;
  294. for(n=0;n<infilecnt;n++) {
  295. if((dz->ifd[0] = sndopenEx(dz->wordstor[n],0,CDP_OPEN_RDONLY)) < 0) {
  296. if(dz->mode!=BY_FILETYPE) {
  297. if(!done_errmsg) {
  298. sprintf(errstr,"Some files are NOT soundfiles.\n");
  299. print_outmessage_flush(errstr);
  300. done_errmsg = 1;
  301. }
  302. }
  303. dz->ifd[0] = -1;
  304. continue;
  305. } else if((dz->mode!=BY_FILETYPE) && filename_extension_is_not_sound(dz->wordstor[n])) {
  306. if(!done_errmsg) {
  307. sprintf(errstr,"Some files are NOT soundfiles.\n");
  308. print_outmessage_flush(errstr);
  309. done_errmsg = 1;
  310. }
  311. continue;
  312. }
  313. switch(dz->mode) {
  314. case(BY_SRATE):
  315. if((exit_status = do_srates(filename,dz->wordstor[n],&file48,&file44,&file32,&file24,&file22,&file16,
  316. &is_file48,&is_file44,&is_file32,&is_file24,&is_file22,&is_file16,
  317. &fp48,&fp44,&fp32,&fp24,&fp22,&fp16,dz))<0)
  318. return(exit_status);
  319. break;
  320. case(BY_DURATION):
  321. case(BY_LOG_DUR):
  322. if((exit_status = do_lenths(filename,dz->wordstor[n],&namestore,lstore,&namestoresize,lcnt,sortlens,dz))<0)
  323. return(exit_status);
  324. break;
  325. case(IN_DUR_ORDER):
  326. if((exit_status = do_order
  327. (filename,dz->wordstor[n],&namestore,&lenstore,&posstore,&lstore,&fileno,&namestoresize,dz))<0)
  328. return(exit_status);
  329. break;
  330. case(BY_FILETYPE):
  331. if((exit_status = do_types(filename,dz->wordstor[n],
  332. &monofile,&stereofile,&quadfile,&analfile,&pitchfile,&transfile,&formantfile,&envfile,&otherfile,
  333. &is_mono_list,&is_stereo_list,&is_quad_list,&is_anal_list,
  334. &is_pitch_list,&is_trans_list,&is_fmnt_list,&is_env_list,&is_other_list,
  335. &fpm,&fps,&fpa,&fpp,&fpt,&fpf,&fpe,&fpo,&fpq,dz))<0)
  336. return(exit_status);
  337. break;
  338. case(FIND_ROGUES):
  339. do_rogues(dz->wordstor[n],&a_srate,dz);
  340. break;
  341. }
  342. if(dz->ifd[0]!=-1 && sndcloseEx(dz->ifd[0])<0)
  343. fprintf(stdout,"WARNING: Failed to close sndfile %s.\n",dz->wordstor[n]);
  344. dz->ifd[0] = -1;
  345. }
  346. switch(dz->mode) {
  347. case(BY_LOG_DUR):
  348. case(BY_DURATION):
  349. if((exit_status = output_lenths(filename,&otherfile,lstore,sortlens,lcnt,dz))<0)
  350. return(exit_status);
  351. break;
  352. case(BY_SRATE):
  353. output_srates(is_file48,is_file44,is_file32,is_file24,is_file22,is_file16,
  354. file48, file44,file32,file24,file22,file16);
  355. break;
  356. case(IN_DUR_ORDER):
  357. if((exit_status = output_order(filename,&otherfile,posstore,lenstore,lstore,fileno,dz))<0)
  358. return(exit_status);
  359. break;
  360. case(BY_FILETYPE):
  361. output_types(filename,is_mono_list,is_stereo_list,is_quad_list,
  362. is_anal_list,is_pitch_list,is_trans_list,is_fmnt_list,is_env_list,
  363. is_other_list,monofile,stereofile,quadfile,analfile,pitchfile,
  364. transfile,formantfile,envfile,otherfile);
  365. break;
  366. }
  367. fflush(stdout);
  368. return(FINISHED);
  369. }
  370. /********************* READ_AND_SORT_PROPERTIES **********************/
  371. int read_and_sort_properties(char *infilename,dataptr dz)
  372. {
  373. int ttype = IS_MONO, exit_status;
  374. double maxamp, maxloc;
  375. int maxrep;
  376. int getmax = 0, getmaxinfo = 0;
  377. infileptr ifp;
  378. if((ifp = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  379. sprintf(errstr,"INSUFFICIENT MEMORY to store data on files.\n");
  380. return(MEMORY_ERROR);
  381. }
  382. if((exit_status = readhead(ifp,dz->ifd[0],infilename,&maxamp,&maxloc,&maxrep,getmax,getmaxinfo))<0)
  383. return(exit_status);
  384. copy_to_fileptr(ifp,dz->infile);
  385. if(dz->infile->filetype != SNDFILE) {
  386. switch(dz->infile->filetype) {
  387. case(PITCHFILE): return(IS_PITCH);
  388. case(TRANSPOSFILE): return(IS_TRANSPOS);
  389. case(FORMANTFILE): return(IS_FMNT);
  390. case(ENVFILE): return(IS_ENV);
  391. case(ANALFILE): return(IS_ANAL);
  392. default:
  393. sprintf(errstr,"This program only works with sound files or CDP-derived files.\n");
  394. return(DATA_ERROR);
  395. }
  396. }
  397. if(dz->infile->channels==2)
  398. ttype = IS_STEREO;
  399. else if(dz->infile->channels==4)
  400. ttype = IS_QUAD;
  401. else if(dz->infile->channels != 1) {
  402. sprintf(errstr,"Program accepts sndfiles which are mono, stereo or quad, only.\n");
  403. return(DATA_ERROR);
  404. }
  405. return(ttype);
  406. }
  407. /********************* DO_SRATES *********************/
  408. int do_srates(char *infilename,char *thisfilename,
  409. char **file48,char **file44,char **file32,char **file24,char **file22,char **file16,
  410. int *is_file48,int *is_file44,int *is_file32,int *is_file24,int *is_file22,int *is_file16,
  411. FILE **fp48,FILE **fp44,FILE **fp32,FILE **fp24,FILE **fp22,FILE **fp16,dataptr dz)
  412. {
  413. char temp[4];
  414. switch(read_srate(thisfilename,dz)) {
  415. case(48):
  416. if(!*is_file48) {
  417. if((*file48 = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  418. sprintf(errstr,"INSUFFICIENT MEMORY from srate 48000 filename.\n");
  419. return(MEMORY_ERROR);
  420. }
  421. strcpy(*file48,infilename);
  422. if(sloom) {
  423. sprintf(temp,"%d",outfcnt);
  424. strcat(*file48,temp);
  425. outfcnt++;
  426. } else
  427. strcat(*file48,".48");
  428. if((*fp48 = fopen(*file48,"w"))==NULL) {
  429. sprintf(errstr,"Cannot open file '%s' to write list of 48000 files.\n",*file48);
  430. return(SYSTEM_ERROR);
  431. }
  432. *is_file48 = TRUE;
  433. }
  434. fprintf(*fp48,"%s\n",thisfilename);
  435. break;
  436. case(44):
  437. if(!*is_file44) {
  438. if((*file44 = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  439. sprintf(errstr,"INSUFFICIENT MEMORY from srate 44100 filename.\n");
  440. return(MEMORY_ERROR);
  441. }
  442. strcpy(*file44,infilename);
  443. if(sloom) {
  444. sprintf(temp,"%d",outfcnt);
  445. strcat(*file44,temp);
  446. outfcnt++;
  447. } else
  448. strcat(*file44,".44");
  449. if((*fp44 = fopen(*file44,"w"))==NULL) {
  450. sprintf(errstr,"Cannot open file '%s' to write list of 44100 files.\n",*file44);
  451. return(SYSTEM_ERROR);
  452. }
  453. *is_file44 = TRUE;
  454. }
  455. fprintf(*fp44,"%s\n",thisfilename);
  456. break;
  457. case(32):
  458. if(!*is_file32) {
  459. if((*file32 = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  460. sprintf(errstr,"INSUFFICIENT MEMORY from srate 32000 filename.\n");
  461. return(MEMORY_ERROR);
  462. }
  463. strcpy(*file32,infilename);
  464. if(sloom) {
  465. sprintf(temp,"%d",outfcnt);
  466. strcat(*file32,temp);
  467. outfcnt++;
  468. } else
  469. strcat(*file32,".32");
  470. if((*fp32 = fopen(*file32,"w"))==NULL) {
  471. sprintf(errstr,"Cannot open file '%s' to write list of 32000 files.\n",*file32);
  472. return(SYSTEM_ERROR);
  473. }
  474. *is_file32 = TRUE;
  475. }
  476. fprintf(*fp32,"%s\n",thisfilename);
  477. break;
  478. case(24):
  479. if(!*is_file24) {
  480. if((*file24 = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  481. sprintf(errstr,"INSUFFICIENT MEMORY from srate 24000 filename.\n");
  482. return(MEMORY_ERROR);
  483. }
  484. strcpy(*file24,infilename);
  485. if(sloom) {
  486. sprintf(temp,"%d",outfcnt);
  487. strcat(*file24,temp);
  488. outfcnt++;
  489. } else
  490. strcat(*file24,".24");
  491. if((*fp24 = fopen(*file24,"w"))==NULL) {
  492. sprintf(errstr,"Cannot open file '%s' to write list of 24000 files.\n",*file24);
  493. return(SYSTEM_ERROR);
  494. }
  495. *is_file24 = TRUE;
  496. }
  497. fprintf(*fp24,"%s\n",thisfilename);
  498. break;
  499. case(22):
  500. if(!*is_file22) {
  501. if((*file22 = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  502. sprintf(errstr,"INSUFFICIENT MEMORY from srate 22050 filename.\n");
  503. return(MEMORY_ERROR);
  504. }
  505. strcpy(*file22,infilename);
  506. if(sloom) {
  507. sprintf(temp,"%d",outfcnt);
  508. strcat(*file22,temp);
  509. outfcnt++;
  510. } else
  511. strcat(*file22,".22");
  512. if((*fp22 = fopen(*file22,"w"))==NULL) {
  513. sprintf(errstr,"Cannot open file '%s' to write list of 22050 files.\n",*file22);
  514. return(SYSTEM_ERROR);
  515. }
  516. *is_file22 = TRUE;
  517. }
  518. fprintf(*fp22,"%s\n",thisfilename);
  519. break;
  520. case(16):
  521. if(!*is_file16) {
  522. if((*file16 = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  523. sprintf(errstr,"INSUFFICIENT MEMORY from srate 16000 filename.\n");
  524. return(MEMORY_ERROR);
  525. }
  526. strcpy(*file16,infilename);
  527. if(sloom) {
  528. sprintf(temp,"%d",outfcnt);
  529. strcat(*file16,temp);
  530. outfcnt++;
  531. } else
  532. strcat(*file16,".16");
  533. if((*fp16 = fopen(*file16,"w"))==NULL) {
  534. sprintf(errstr,"Cannot open file '%s' to write list of 16000 files.\n",*file16);
  535. return(SYSTEM_ERROR);
  536. }
  537. *is_file16 = TRUE;
  538. }
  539. fprintf(*fp16,"%s\n",thisfilename);
  540. break;
  541. default:
  542. sprintf(errstr,"Ignoring file '%s'\n",thisfilename);
  543. print_outmessage_flush(errstr);
  544. break;
  545. }
  546. return(FINISHED);
  547. }
  548. /********************* DO_ROGUES **********************/
  549. void do_rogues(char *infilename,int *a_srate,dataptr dz)
  550. {
  551. if(read_special_type(dz)<0)
  552. return;
  553. if(read_srate(infilename,dz)<0)
  554. return;
  555. if(*a_srate==0)
  556. *a_srate = dz->infile->srate;
  557. else if(*a_srate!= dz->infile->srate) {
  558. sprintf(errstr,"%s has different sampling rate [%d] to earlier file [%d]\n",
  559. infilename,dz->infile->srate,*a_srate);
  560. print_outmessage_flush(errstr);
  561. return;
  562. }
  563. if(read_channels(infilename,dz)<0)
  564. return;
  565. get_length(infilename,dz);
  566. }
  567. /********************* READ_SRATE **********************/
  568. int read_srate(char *infilename,dataptr dz)
  569. {
  570. int k;
  571. //TW CHANGED
  572. // if(sfgetprop(dz->ifd[0], "sample rate", (char *)&dz->infile->srate, sizeof(int)) < 0) {
  573. if(sndgetprop(dz->ifd[0], "sample rate", (char *)&dz->infile->srate, sizeof(int)) < 0) {
  574. fprintf(stdout,"WARNING: Can't read sample rate from input soundfile %s\n",infilename);
  575. return(-1);
  576. }
  577. k = (int)(dz->infile->srate/1000);
  578. return(k);
  579. }
  580. /********************* READ_SPECIAL_TYPE **********************/
  581. int read_special_type(dataptr dz)
  582. {
  583. int pppp = 0;
  584. //TW CHANGED TO sndgetprop THROUGHOUT
  585. if(sndgetprop(dz->ifd[0], "is an envelope", (char *)&pppp, sizeof(int)) >=0) {
  586. sprintf(errstr,"%s is an envelope file\n",snd_getfilename(dz->ifd[0]));
  587. print_outmessage_flush(errstr);
  588. return(-1);
  589. }
  590. if(sndgetprop(dz->ifd[0], "is a pitch file", (char *)&pppp, sizeof(int)) >=0) {
  591. sprintf(errstr,"%s is a pitch file\n",snd_getfilename(dz->ifd[0]));
  592. print_outmessage_flush(errstr);
  593. return(-1);
  594. }
  595. if(sndgetprop(dz->ifd[0], "is a transpos file", (char *)&pppp, sizeof(int)) >=0) {
  596. sprintf(errstr,"%s is a transposition file\n",snd_getfilename(dz->ifd[0]));
  597. print_outmessage_flush(errstr);
  598. return(-1);
  599. }
  600. if(sndgetprop(dz->ifd[0], "is a formant file", (char *)&pppp, sizeof(int)) >=0) {
  601. sprintf(errstr,"%s is a formant file\n",snd_getfilename(dz->ifd[0]));
  602. print_outmessage_flush(errstr);
  603. return(-1);
  604. }
  605. return(0);
  606. }
  607. /********************* READ_CHANNELS **********************/
  608. int read_channels(char *infilename,dataptr dz)
  609. {
  610. int channels;
  611. //TW CHANGED
  612. if(sndgetprop(dz->ifd[0], "channels", (char *)&channels, sizeof(int)) < 0) {
  613. fprintf(stdout,"WARNING: Can't read channels from input soundfile %s\n",infilename);
  614. return(-1);
  615. }
  616. if(channels!=1 && channels!=2 && channels != 4) {
  617. fprintf(stdout,"WARNING: Invalid channel count [%d] from input soundfile %s\n",channels,infilename);
  618. return(-1);
  619. }
  620. return(0);
  621. }
  622. /********************* GET_LENGTH **********************/
  623. void get_length(char *infilename,dataptr dz)
  624. {
  625. if((dz->insams[0] = sndsizeEx(dz->ifd[0]))<0) {
  626. fprintf(stdout, "WARNING: Can't read size of input file %s.\n",infilename);
  627. return;
  628. }
  629. if(dz->insams[0] <=0)
  630. fprintf(stdout, "WARNING: No data in file %s.\n",infilename);
  631. }
  632. /********************* DO_LENTHS *********************/
  633. int do_lenths(char *infilename,char *thisfilename,char **namestore,char ***lstore,int *namestoresize,
  634. int *lcnt,double *sortlens,dataptr dz)
  635. {
  636. int exit_status;
  637. int k, thislen;
  638. double d;
  639. char *namestoreend;
  640. if((exit_status = read_and_sort_properties(thisfilename,dz))<0)
  641. return(exit_status);
  642. if((dz->insams[0] = sndsizeEx(dz->ifd[0]))<0) {
  643. sprintf(errstr, "Can't read size of input file %s.\n",infilename);
  644. return(PROGRAM_ERROR);
  645. }
  646. d = (double)(dz->insams[0]/dz->infile->channels)/(double)dz->infile->srate;
  647. for(k=0;k<dz->iparam[SORT_LENCNT]-1;k++) {
  648. if(d<sortlens[k])
  649. break;
  650. }
  651. thislen = strlen(thisfilename)+1;
  652. namestoreend = *namestore + *namestoresize;
  653. *namestoresize += thislen;
  654. strcpy(namestoreend,thisfilename);
  655. lstore[k][lcnt[k]] = namestoreend;
  656. lcnt[k]++;
  657. return(FINISHED);
  658. }
  659. /********************* CREATE_LFILE *********************/
  660. int create_lfile(char *infilename,char **otherfile,char ***lstore,double *sortlens,int *lcnt,dataptr dz)
  661. {
  662. int n, m;
  663. FILE *fpo;
  664. if((*otherfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  665. sprintf(errstr,"INSUFFICIENT MEMORY from otherfile name.\n");
  666. return(MEMORY_ERROR);
  667. }
  668. strcpy(*otherfile,infilename);
  669. if(!sloom)
  670. strcat(*otherfile,".len");
  671. if((fpo = fopen(*otherfile,"w"))==NULL) {
  672. sprintf(errstr,"Cannot open file %s to write data\n",*otherfile);
  673. return(SYSTEM_ERROR);
  674. }
  675. for(n=0;n<dz->iparam[SORT_LENCNT]-1;n++) {
  676. if(lcnt[n]) {
  677. if(dz->vflag[DONT_SHOW_DURS]) {
  678. fprintf(fpo, "\n");
  679. sprintf(errstr,"\n");
  680. print_outmessage(errstr);
  681. }else {
  682. fprintf(fpo, "\n%d Files <= %.3lf secs\n",lcnt[n],sortlens[n]);
  683. sprintf(errstr,"%d Files <= %.3lf secs\n",lcnt[n],sortlens[n]);
  684. print_outmessage(errstr);
  685. } for(m=0;m<lcnt[n];m++) {
  686. fprintf(fpo, "%s\n",lstore[n][m]);
  687. sprintf(errstr,"%s\n",lstore[n][m]);
  688. print_outmessage(errstr);
  689. }
  690. }
  691. }
  692. fflush(stdout);
  693. if(lcnt[n]) {
  694. if(dz->vflag[DONT_SHOW_DURS]) {
  695. fprintf(fpo, "\n");
  696. sprintf(errstr,"\n");
  697. print_outmessage(errstr);
  698. } else {
  699. fprintf(fpo, "\n%d Files > %.3lf secs\n",lcnt[n],sortlens[n-1]);
  700. sprintf(errstr,"%d Files > %.3lf secs\n",lcnt[n],sortlens[n-1]);
  701. print_outmessage(errstr);
  702. }
  703. for(m=0;m<lcnt[n];m++) {
  704. fprintf(fpo ,"%s\n",lstore[n][m]);
  705. sprintf(errstr,"%s\n",lstore[n][m]);
  706. print_outmessage(errstr);
  707. }
  708. }
  709. fflush(stdout);
  710. if(fclose(fpo)<0) {
  711. fprintf(stdout,"WARNING: Failed to close output textfile.\n");
  712. fflush(stdout);
  713. }
  714. return(FINISHED);
  715. }
  716. /********************* CREATE_OFILE *********************/
  717. int create_ofile(char *infilename,char **otherfile,int cnt,char ***lstore,double *lenstore,int *posstore,dataptr dz)
  718. {
  719. int n, m;
  720. int spacesize = 32, thisspace;
  721. char *p;
  722. FILE *fpo;
  723. if((*otherfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  724. sprintf(errstr,"INSUFFICIENT MEMORY from otherfile name.\n");
  725. return(MEMORY_ERROR);
  726. }
  727. strcpy(*otherfile,infilename);
  728. if(!sloom)
  729. strcat(*otherfile,".len");
  730. if((fpo = fopen(*otherfile,"w"))==NULL) {
  731. sprintf(errstr,"Cannot open file %s to write data\n",*otherfile);
  732. return(SYSTEM_ERROR);
  733. }
  734. if(dz->vflag[DONT_SHOW_DURS]) {
  735. for(n=0;n<cnt;n++) {
  736. fprintf(fpo, "%s\n",lstore[0][posstore[n]]);
  737. sprintf(errstr,"%s\n",lstore[0][posstore[n]]);
  738. print_outmessage(errstr);
  739. }
  740. } else {
  741. for(n=0;n<cnt;n++) {
  742. sprintf(errstr,"%.6lf secs",lenstore[n]);
  743. thisspace = spacesize - strlen(errstr);
  744. for(m=0;m<thisspace;m++)
  745. strcat(errstr," ");
  746. p = errstr + strlen(errstr);
  747. sprintf(p,"%s\n",lstore[0][posstore[n]]);
  748. fprintf(fpo,"%s",errstr);
  749. print_outmessage(errstr);
  750. }
  751. }
  752. fflush(stdout);
  753. if(fclose(fpo)<0) {
  754. fprintf(stdout,"WARNING: Failed to close output textfile.\n");
  755. fflush(stdout);
  756. }
  757. return(FINISHED);
  758. }
  759. /********************* DO_TYPES *********************/
  760. int do_types(char *infilename, char *thisfilename,char **monofile,char **stereofile,char **quadfile,
  761. char **analfile,char **pitchfile, char **transfile,char **formantfile,char **envfile,char **otherfile,
  762. int *is_mono_list,int *is_stereo_list,int *is_quad_list,int *is_anal_list,int *is_pitch_list,
  763. int *is_trans_list,int *is_fmnt_list,int *is_env_list,int *is_other_list,
  764. FILE **fpm,FILE **fps,FILE **fpa,FILE **fpp,FILE **fpt,FILE **fpf,
  765. FILE **fpe,FILE **fpo,FILE **fpq,dataptr dz)
  766. {
  767. char temp[4];
  768. if(dz->ifd[0]==-1) {
  769. if(!*is_other_list) {
  770. if((*otherfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  771. sprintf(errstr,"INSUFFICIENT MEMORY from forman file name.\n");
  772. return(MEMORY_ERROR);
  773. }
  774. strcpy(*otherfile,infilename);
  775. if(sloom) {
  776. sprintf(temp,"%d",outfcnt);
  777. strcat(*otherfile,temp);
  778. outfcnt++;
  779. } else
  780. strcat(*otherfile,".ott");
  781. if((*fpo = fopen(*otherfile,"w"))==NULL) {
  782. sprintf(errstr,"Cannot open file '%s' to write list of other data files.\n",*otherfile);
  783. return(SYSTEM_ERROR);
  784. }
  785. *is_other_list = TRUE;
  786. }
  787. fprintf(*fpo,"%s\n",thisfilename);
  788. return(FINISHED);
  789. }
  790. switch(read_and_sort_properties(thisfilename,dz)) {
  791. case(IS_MONO): /* Mono sndfile */
  792. if(!*is_mono_list) {
  793. if((*monofile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  794. sprintf(errstr,"INSUFFICIENT MEMORY from monofile name.\n");
  795. return(MEMORY_ERROR);
  796. }
  797. strcpy(*monofile,infilename);
  798. if(sloom) {
  799. sprintf(temp,"%d",outfcnt);
  800. strcat(*monofile,temp);
  801. outfcnt++;
  802. } else
  803. strcat(*monofile,".mot");
  804. if((*fpm = fopen(*monofile,"w"))==NULL) {
  805. sprintf(errstr,"Cannot open file '%s' to write list of mono files.\n",*monofile);
  806. return(SYSTEM_ERROR);
  807. }
  808. *is_mono_list = TRUE;
  809. }
  810. fprintf(*fpm,"%s\n",thisfilename);
  811. break;
  812. case(IS_STEREO): /* Stereo sndfile */
  813. if(!*is_stereo_list) {
  814. if((*stereofile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  815. sprintf(errstr,"INSUFFICIENT MEMORY from stereofile name.\n");
  816. return(MEMORY_ERROR);
  817. }
  818. strcpy(*stereofile,infilename);
  819. if(sloom) {
  820. sprintf(temp,"%d",outfcnt);
  821. strcat(*stereofile,temp);
  822. outfcnt++;
  823. } else
  824. strcat(*stereofile,".stt");
  825. if((*fps = fopen(*stereofile,"w"))==NULL) {
  826. sprintf(errstr,"Cannot open file '%s' to write list of stereo files.\n",*stereofile);
  827. return(SYSTEM_ERROR);
  828. }
  829. *is_stereo_list = TRUE;
  830. }
  831. fprintf(*fps,"%s\n",thisfilename);
  832. break;
  833. case(IS_QUAD): /* Quad sndfile */
  834. if(!*is_quad_list) {
  835. if((*quadfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  836. sprintf(errstr,"INSUFFICIENT MEMORY from quadfile name.\n");
  837. return(MEMORY_ERROR);
  838. }
  839. strcpy(*quadfile,infilename);
  840. if(sloom) {
  841. sprintf(temp,"%d",outfcnt);
  842. strcat(*quadfile,temp);
  843. outfcnt++;
  844. } else
  845. strcat(*quadfile,".qdt");
  846. if((*fpq = fopen(*quadfile,"w"))==NULL) {
  847. sprintf(errstr,"Cannot open file '%s' to write list of quad files.\n",*quadfile);
  848. return(SYSTEM_ERROR);
  849. }
  850. *is_quad_list = TRUE;
  851. }
  852. fprintf(*fpq,"%s\n",thisfilename);
  853. break;
  854. case(IS_ANAL): /* Analysis file */
  855. if(!*is_anal_list) {
  856. if((*analfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  857. sprintf(errstr,"INSUFFICIENT MEMORY from analfile name.\n");
  858. return(MEMORY_ERROR);
  859. }
  860. strcpy(*analfile,infilename);
  861. if(sloom) {
  862. sprintf(temp,"%d",outfcnt);
  863. strcat(*analfile,temp);
  864. outfcnt++;
  865. } else
  866. strcat(*analfile,".ant");
  867. if((*fpa = fopen(*analfile,"w"))==NULL) {
  868. sprintf(errstr,"Cannot open file '%s' to write list of analysis files.\n",*analfile);
  869. return(SYSTEM_ERROR);
  870. }
  871. *is_anal_list = TRUE;
  872. }
  873. fprintf(*fpa,"%s\n",thisfilename);
  874. break;
  875. case(IS_PITCH): /* Pitch data file */
  876. if(!*is_pitch_list) {
  877. if((*pitchfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  878. sprintf(errstr,"INSUFFICIENT MEMORY from pitchfile name.\n");
  879. return(MEMORY_ERROR);
  880. }
  881. strcpy(*pitchfile,infilename);
  882. if(sloom) {
  883. sprintf(temp,"%d",outfcnt);
  884. strcat(*pitchfile,temp);
  885. outfcnt++;
  886. } else
  887. strcat(*pitchfile,".pct");
  888. if((*fpp = fopen(*pitchfile,"w"))==NULL) {
  889. sprintf(errstr,"Cannot open file '%s' to write list of pitchdata files.\n",*pitchfile);
  890. return(SYSTEM_ERROR);
  891. }
  892. *is_pitch_list = TRUE;
  893. }
  894. fprintf(*fpp,"%s\n",thisfilename);
  895. break;
  896. case(IS_TRANSPOS): /* Transposition data file */
  897. if(!*is_trans_list) {
  898. if((*transfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  899. sprintf(errstr,"INSUFFICIENT MEMORY from transposition file name.\n");
  900. return(MEMORY_ERROR);
  901. }
  902. strcpy(*transfile,infilename);
  903. if(sloom) {
  904. sprintf(temp,"%d",outfcnt);
  905. strcat(*transfile,temp);
  906. outfcnt++;
  907. } else
  908. strcat(*transfile,".trt");
  909. if((*fpt = fopen(*transfile,"w"))==NULL) {
  910. sprintf(errstr,"Cannot open file '%s' to write list of transposition data files.\n",*transfile);
  911. return(SYSTEM_ERROR);
  912. }
  913. *is_trans_list = TRUE;
  914. }
  915. fprintf(*fpt,"%s\n",thisfilename);
  916. break;
  917. case(IS_FMNT): /* Formant Data file */
  918. if(!*is_fmnt_list) {
  919. if((*formantfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  920. sprintf(errstr,"INSUFFICIENT MEMORY from forman file name.\n");
  921. return(MEMORY_ERROR);
  922. }
  923. strcpy(*formantfile,infilename);
  924. if(sloom) {
  925. sprintf(temp,"%d",outfcnt);
  926. strcat(*formantfile,temp);
  927. outfcnt++;
  928. } else
  929. strcat(*formantfile,".fot");
  930. if((*fpf = fopen(*formantfile,"w"))==NULL) {
  931. sprintf(errstr,"Cannot open file '%s' to write list of formant data files.\n",*formantfile);
  932. return(SYSTEM_ERROR);
  933. }
  934. *is_fmnt_list = TRUE;
  935. }
  936. fprintf(*fpf,"%s\n",thisfilename);
  937. break;
  938. case(IS_ENV): /* Formant Data file */
  939. if(!*is_env_list) {
  940. if((*envfile = (char *)malloc((strlen(infilename)+5) * sizeof(char)))==NULL) {
  941. sprintf(errstr,"INSUFFICIENT MEMORY from other file name.\n");
  942. return(MEMORY_ERROR);
  943. }
  944. strcpy(*envfile,infilename);
  945. if(sloom) {
  946. sprintf(temp,"%d",outfcnt);
  947. strcat(*envfile,temp);
  948. outfcnt++;
  949. } else
  950. strcat(*envfile,".ett");
  951. if((*fpe = fopen(*envfile,"w"))==NULL) {
  952. sprintf(errstr,"Cannot open file '%s' to write list of formant data files.\n",*envfile);
  953. return(SYSTEM_ERROR);
  954. }
  955. *is_env_list = TRUE;
  956. }
  957. fprintf(*fpe,"%s\n",thisfilename);
  958. break;
  959. default:
  960. sprintf(errstr,"Unknown case in do_types()\n");
  961. return(PROGRAM_ERROR);
  962. }
  963. return(FINISHED);
  964. }
  965. /********************* OUTPUT_LENTHS *********************/
  966. //TW REVISED
  967. int output_lenths(char *infilename,char **otherfile,char ***lstore,double *sortlens,int *lcnt,dataptr dz)
  968. {
  969. int exit_status;
  970. int n, sum = 0;
  971. for(n=0;n<dz->iparam[SORT_LENCNT];n++)
  972. sum += lcnt[n];
  973. if(sum==0) {
  974. sprintf(errstr,"NO VALID FILES FOUND.\n");
  975. print_outmessage(errstr);
  976. } else {
  977. if((exit_status = create_lfile(infilename,otherfile,lstore,sortlens,lcnt,dz))<0)
  978. return(exit_status);
  979. //TW UPDATE
  980. if(!sloom && !sloombatch)
  981. fprintf(stdout,"\nCREATED SORT FILE '%s'\n",*otherfile);
  982. else {
  983. fprintf(stdout,"INFO: \n");
  984. fprintf(stdout,"INFO: CREATED SORT FILE '%s'\n",*otherfile);
  985. }
  986. }
  987. fflush(stdout);
  988. return(FINISHED);
  989. }
  990. /********************* OUTPUT_SRATES *********************/
  991. void output_srates(int is_file48,int is_file44,int is_file32,int is_file24,int is_file22,int is_file16,
  992. char *file48,char *file44,char *file32,char *file24,char *file22,char *file16)
  993. {
  994. if(!is_file48 && !is_file44 && !is_file32
  995. && !is_file24 && !is_file22 && !is_file16) {
  996. sprintf(errstr,"NO SORT FILES CREATED.\n");
  997. print_outmessage(errstr);
  998. } else {
  999. //TW UPDATE
  1000. if(!sloom && !sloombatch)
  1001. fprintf(stdout,"\nCREATED SORT FILES....\n");
  1002. else {
  1003. fprintf(stdout,"INFO: \n");
  1004. fprintf(stdout,"INFO: CREATED SORT FILES....\n");
  1005. }
  1006. //TW UPDATE
  1007. if(!sloom && !sloombatch) {
  1008. if(is_file48) fprintf(stdout,"%s\n",file48);
  1009. if(is_file44) fprintf(stdout,"%s\n",file44);
  1010. if(is_file32) fprintf(stdout,"%s\n",file32);
  1011. if(is_file24) fprintf(stdout,"%s\n",file24);
  1012. if(is_file22) fprintf(stdout,"%s\n",file22);
  1013. if(is_file16) fprintf(stdout,"%s\n",file16);
  1014. } else {
  1015. if(is_file48) fprintf(stdout,"INFO: %s LISTING FILES OF SAMPLE RATE 48000\n",file48);
  1016. if(is_file44) fprintf(stdout,"INFO: %s LISTING FILES OF SAMPLE RATE 44100\n",file44);
  1017. if(is_file32) fprintf(stdout,"INFO: %s LISTING FILES OF SAMPLE RATE 32000\n",file32);
  1018. if(is_file24) fprintf(stdout,"INFO: %s LISTING FILES OF SAMPLE RATE 24000\n",file24);
  1019. if(is_file22) fprintf(stdout,"INFO: %s LISTING FILES OF SAMPLE RATE 22050\n",file22);
  1020. if(is_file16) fprintf(stdout,"INFO: %s LISTING FILES OF SAMPLE RATE 16000\n",file16);
  1021. }
  1022. }
  1023. fflush(stdout);
  1024. }
  1025. /********************* OUTPUT_TYPES *********************/
  1026. void output_types(char *infilename,int is_mono_list,int is_stereo_list,int is_quad_list,
  1027. int is_anal_list,int is_pitch_list,
  1028. int is_trans_list,int is_fmnt_list,int is_env_list,int is_other_list,
  1029. char *monofile,char *stereofile,char *quadfile,char *analfile,char *pitchfile,char *transfile,
  1030. char *formantfile,char *envfile,char *otherfile)
  1031. {
  1032. if(!is_mono_list && !is_stereo_list && !is_quad_list && !is_anal_list
  1033. && !is_pitch_list && !is_trans_list && !is_fmnt_list && !is_env_list) {
  1034. if(!is_other_list) {
  1035. sprintf(errstr,"NO SORT FILES CREATED.\n");
  1036. print_outmessage(errstr);
  1037. } else {
  1038. sprintf(errstr,"NO VALID FILES FOUND : see '%s.ott' for files recognised.\n",infilename);
  1039. print_outmessage(errstr);
  1040. }
  1041. } else {
  1042. //TW UPDATE
  1043. if(!sloom && !sloombatch)
  1044. fprintf(stdout,"\nCREATED SORT FILES....\n");
  1045. else {
  1046. fprintf(stdout,"INFO: \n");
  1047. fprintf(stdout,"INFO: CREATED SORT FILES....\n");
  1048. }
  1049. //TW UPDATE
  1050. if(!sloom && !sloombatch) {
  1051. if(is_mono_list) fprintf(stdout,"%s\n",monofile);
  1052. if(is_stereo_list) fprintf(stdout,"%s\n",stereofile);
  1053. if(is_quad_list) fprintf(stdout,"%s\n",quadfile);
  1054. if(is_anal_list) fprintf(stdout,"%s\n",analfile);
  1055. if(is_pitch_list) fprintf(stdout,"%s\n",pitchfile);
  1056. if(is_trans_list) fprintf(stdout,"%s\n",transfile);
  1057. if(is_fmnt_list) fprintf(stdout,"%s\n",formantfile);
  1058. if(is_env_list) fprintf(stdout,"%s\n",envfile);
  1059. if(is_other_list) fprintf(stdout,"%s\n",otherfile);
  1060. } else {
  1061. if(is_mono_list) fprintf(stdout,"INFO: %s of MONO SNDFILES.\n",monofile);
  1062. if(is_stereo_list) fprintf(stdout,"INFO: %s of STEREO SNDFILES.\n",stereofile);
  1063. if(is_quad_list) fprintf(stdout,"INFO: %s of QUAD SNDFILES.\n",quadfile);
  1064. if(is_anal_list) fprintf(stdout,"INFO: %s of ANALYSIS FILES.\n",analfile);
  1065. if(is_pitch_list) fprintf(stdout,"INFO: %s of BINARY PITCH FILES.\n",pitchfile);
  1066. if(is_trans_list) fprintf(stdout,"INFO: %s of BINARY TRANSPOSITION FILES.\n",transfile);
  1067. if(is_fmnt_list) fprintf(stdout,"INFO: %s of FORMANT FILES.\n",formantfile);
  1068. if(is_env_list) fprintf(stdout,"INFO: %s of BINARY ENVELOPE FILES.\n",envfile);
  1069. if(is_other_list) fprintf(stdout,"INFO: %s of TEXT FILES.\n",otherfile);
  1070. }
  1071. }
  1072. fflush(stdout);
  1073. }
  1074. /********************* STRIP_EXTENSION *********************/
  1075. void strip_extension(char *filename)
  1076. {
  1077. char *p;
  1078. int OK = 0;
  1079. p = filename + strlen(filename) - 1;
  1080. while(*p!='.') {
  1081. if(--p==filename) {
  1082. OK = TRUE;
  1083. break;
  1084. }
  1085. }
  1086. if(!OK)
  1087. *p = ENDOFSTR;
  1088. }
  1089. /********************* TEST_LENVALS *********************/
  1090. int sort_preprocess(dataptr dz)
  1091. {
  1092. // int cnt = 0;
  1093. double sum, lastsum;
  1094. switch(dz->mode) {
  1095. case(BY_DURATION):
  1096. case(BY_LOG_DUR):
  1097. dz->iparam[SORT_LENCNT] = 0;
  1098. if(flteq(dz->param[SORT_SMALL],dz->param[SORT_LARGE])) {
  1099. sprintf(errstr,"Parameters for durations are the same: can't proceed.\n");
  1100. return(DATA_ERROR);
  1101. }
  1102. if(dz->param[SORT_LARGE] < dz->param[SORT_SMALL]) {
  1103. fprintf(stdout,"WARNING: Duration parameters inverted: swapping them round.\n");
  1104. swap(&(dz->param[SORT_LARGE]),&(dz->param[SORT_SMALL]));
  1105. }
  1106. sum = dz->param[SORT_SMALL];
  1107. do {
  1108. lastsum = sum;
  1109. if(++dz->iparam[SORT_LENCNT] > MAXTYPES) {
  1110. sprintf(errstr,"Over %d length types: too many!!\n",MAXTYPES);
  1111. return(GOAL_FAILED);
  1112. }
  1113. if(dz->mode==BY_LOG_DUR)
  1114. sum *= dz->param[SORT_STEP];
  1115. else
  1116. sum += dz->param[SORT_STEP];
  1117. } while(sum < dz->param[SORT_LARGE]);
  1118. if(!flteq(lastsum,dz->param[SORT_LARGE])) {
  1119. if(++dz->iparam[SORT_LENCNT] > MAXTYPES) {
  1120. sprintf(errstr,"Over %d length types: too many!!\n",MAXTYPES);
  1121. return(GOAL_FAILED);
  1122. }
  1123. }
  1124. break;
  1125. }
  1126. return(FINISHED);
  1127. }
  1128. /********************* DO_ORDER *********************/
  1129. int do_order(char *infilename,char *thisfilename,char **namestore,double **lenstore,int **posstore,
  1130. char ****lstore,int *fileno,int *namestoresize,dataptr dz)
  1131. {
  1132. int exit_status;
  1133. int n, m, thislen;
  1134. double d;
  1135. char *namestoreend;
  1136. if((exit_status = read_and_sort_properties(thisfilename,dz))<0)
  1137. return(exit_status);
  1138. if((dz->insams[0] = sndsizeEx(dz->ifd[0]))<0) {
  1139. sprintf(errstr, "Can't read size of input file %s.\n",infilename);
  1140. return(PROGRAM_ERROR);
  1141. }
  1142. d = (double)(dz->insams[0]/dz->infile->channels)/(double)dz->infile->srate;
  1143. thislen = strlen(thisfilename)+1;
  1144. namestoreend = *namestore + *namestoresize;
  1145. *namestoresize += thislen;
  1146. strcpy(namestoreend,thisfilename);
  1147. (*lstore)[0][*fileno] = namestoreend;
  1148. if(*fileno) {
  1149. for(n = 0;n < *fileno; n++) {
  1150. if(d <= (*lenstore)[n])
  1151. break;
  1152. }
  1153. if(((*posstore) = (int *)realloc((char *)(*posstore),((*fileno)+1) * sizeof(int )))==NULL) {
  1154. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate posstore.\n");
  1155. return(MEMORY_ERROR);
  1156. }
  1157. if(((*lenstore) = (double *)realloc((char *)(*lenstore),((*fileno)+1) * sizeof(double)))==NULL) {
  1158. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate lenstore.\n");
  1159. return(MEMORY_ERROR);
  1160. }
  1161. if(n != *fileno) {
  1162. for(m = *fileno; m > n; m--) {
  1163. (*lenstore)[m] = (*lenstore)[m-1];
  1164. (*posstore)[m] = (*posstore)[m-1];
  1165. }
  1166. }
  1167. } else {
  1168. if(((*lenstore) = (double *)malloc(sizeof(double))) == NULL) {
  1169. sprintf(errstr,"INSUFFICIENT MEMORY for lenstore.\n");
  1170. return(MEMORY_ERROR);
  1171. }
  1172. if(((*posstore) = (int *)malloc(sizeof(int))) == NULL) {
  1173. sprintf(errstr,"INSUFFICIENT MEMORY for posstore.\n");
  1174. return(MEMORY_ERROR);
  1175. }
  1176. n = 0;
  1177. }
  1178. (*lenstore)[n] = d;
  1179. (*posstore)[n] = *fileno;
  1180. (*fileno)++;
  1181. return(FINISHED);
  1182. }
  1183. /********************* OUTPUT_ORDER *********************/
  1184. int output_order(char *infilename,char **otherfile,int *posstore,double *lenstore,char ***lstore,int cnt,dataptr dz)
  1185. {
  1186. int exit_status;
  1187. if(cnt==0) {
  1188. sprintf(errstr,"NO VALID FILES FOUND.\n");
  1189. print_outmessage(errstr);
  1190. } else {
  1191. if((exit_status = create_ofile(infilename,otherfile,cnt,lstore,lenstore,posstore,dz))<0)
  1192. return(exit_status);
  1193. //TW UPDATE
  1194. if(!sloom && !sloombatch)
  1195. fprintf(stdout,"\nCREATED LENGTH-ORDERED FILE '%s'\n",*otherfile);
  1196. else {
  1197. fprintf(stdout,"INFO: \n");
  1198. fprintf(stdout,"INFO: CREATED LENGTH-ORDERED FILE '%s'\n",*otherfile);
  1199. }
  1200. }
  1201. fflush(stdout);
  1202. return(FINISHED);
  1203. }
  1204. /********************* FILENAME_EXTENSION_IS_NOT_SOUND *********************/
  1205. int filename_extension_is_not_sound(char *filename)
  1206. {
  1207. char *q = filename;
  1208. char *p = filename + strlen(filename);
  1209. while(p > q) {
  1210. p--;
  1211. if(*p == '.') {
  1212. if(!strcmp(p,".evl")
  1213. || !strcmp(p,".frq")
  1214. || !strcmp(p,".trn")
  1215. || !strcmp(p,".ana")
  1216. || !strcmp(p,".for")) {
  1217. return 1;
  1218. }
  1219. }
  1220. }
  1221. return 0;
  1222. }