mainfuncs.c 75 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100
  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. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <osbind.h>
  24. #include <structures.h>
  25. #include <cdpmain.h>
  26. #include <tkglobals.h>
  27. #include <sfsys.h>
  28. #include <cdparams.h>
  29. #include <globcon.h>
  30. #include <localcon.h>
  31. #include <processno.h>
  32. #include <modeno.h>
  33. #include <filetype.h>
  34. #include <formants.h>
  35. #include <pnames.h>
  36. #include <sndinfo.h>
  37. #include <headread.h>
  38. #include <house.h>
  39. #include <pvoc.h>
  40. #include <special.h>
  41. #include <ctype.h>
  42. #include <string.h>
  43. #include <logic.h>
  44. #include <math.h>
  45. #include <float.h>
  46. #include <standalone.h>
  47. #ifdef unix
  48. #define round(x) lround((x))
  49. #else
  50. #define round(x) cdp_round((x))
  51. #endif
  52. static int do_extra_files(dataptr dz);
  53. static void strip_ext(char *temp) ;
  54. static int assign_wavetype(dataptr dz);
  55. extern char *get_other_filename_x(char *filename,char c);
  56. void dz2props(dataptr dz, SFPROPS* props);
  57. /*RWD we only do this for SNDFILEs, not analfiles etc */
  58. void dz2props(dataptr dz, SFPROPS* props)
  59. {
  60. if(dz->outfiletype == SNDFILE_OUT){
  61. switch(dz->true_outfile_stype){
  62. case SAMP_SHORT:
  63. props->samptype = SHORT16;
  64. break;
  65. case SAMP_FLOAT:
  66. props->samptype = FLOAT32;
  67. break;
  68. case SAMP_BYTE:
  69. props->samptype = SHORT8;
  70. break;
  71. case SAMP_LONG:
  72. props->samptype = INT_32;
  73. break;
  74. case SAMP_2424:
  75. props->samptype = INT2424;
  76. break;
  77. case SAMP_2432:
  78. props->samptype = INT2432;
  79. break;
  80. case SAMP_2024:
  81. props->samptype = INT2024;
  82. break;
  83. default:
  84. props->samptype = INT_MASKED;
  85. break;
  86. }
  87. props->srate = dz->outfile->srate;
  88. props->chans = dz->outchans; //or outfile->channels?
  89. props->type = wt_wave;
  90. props->format = WAVE_EX;
  91. props->chformat = MC_STD;
  92. }
  93. }
  94. /************************ SETUP_PARAM_RANGES_AND_DEFAULTS *********************/
  95. int setup_param_ranges_and_defaults(dataptr dz)
  96. {
  97. int exit_status;
  98. aplptr ap = dz->application;
  99. if(ap->total_input_param_cnt>0) {
  100. if((exit_status = set_param_ranges(dz->process,dz->mode,dz->nyquist,dz->frametime,dz->infile->arate,
  101. dz->infile->srate,dz->wlength,dz->insams[0],dz->infile->channels,dz->wanted,
  102. dz->infile->filetype,dz->linecnt,dz->duration,ap))<0)
  103. return(exit_status);
  104. if((exit_status = INITIALISE_DEFAULT_VALUES(dz->process,dz->mode,dz->infile->channels,
  105. dz->nyquist,dz->frametime,dz->insams[0],dz->infile->srate,dz->wanted,
  106. dz->linecnt,dz->duration,ap->default_val,dz->infile->filetype,ap))<0)
  107. return(exit_status);
  108. if(!sloom)
  109. put_default_vals_in_all_params(dz);
  110. else if(dz->process == BRASSAGE || dz->process == SAUSAGE)
  111. put_default_vals_in_all_params(dz);
  112. }
  113. return(FINISHED);
  114. }
  115. /************************ HANDLE_FORMANTS *********************/
  116. int handle_formants(int *cmdlinecnt,char ***cmdline,dataptr dz)
  117. {
  118. int exit_status;
  119. aplptr ap = dz->application;
  120. if(ap->formant_flag) {
  121. if(!sloom) {
  122. if(*cmdlinecnt <= 0) {
  123. sprintf(errstr,"Insufficient parameters on command line\n");
  124. return(USAGE_ONLY);
  125. }
  126. }
  127. if((exit_status = read_formantband_data_and_setup_formants(cmdline,cmdlinecnt,dz))<0)
  128. return(exit_status);
  129. }
  130. return(FINISHED);
  131. }
  132. /************************ HANDLE_FORMANT_QUIKSEARCH *********************/
  133. int handle_formant_quiksearch(int *cmdlinecnt,char ***cmdline,dataptr dz)
  134. {
  135. int exit_status;
  136. aplptr ap = dz->application;
  137. if(ap->formant_qksrch) {
  138. if((exit_status = read_formant_qksrch_flag(cmdline,cmdlinecnt,dz))<0)
  139. return(exit_status);
  140. }
  141. return(FINISHED);
  142. }
  143. /************************ HANDLE_SPECIAL_DATA *********************/
  144. int handle_special_data(int *cmdlinecnt,char ***cmdline,dataptr dz)
  145. {
  146. int exit_status;
  147. aplptr ap = dz->application;
  148. if(ap->special_data) {
  149. if(!sloom) {
  150. if(*cmdlinecnt <= 0) {
  151. sprintf(errstr,"Insufficient parameters on command line.\n");
  152. return(USAGE_ONLY);
  153. }
  154. }
  155. if((exit_status = setup_special_data_ranges
  156. (dz->mode,dz->infile->srate,dz->duration,dz->nyquist,dz->wlength,dz->infile->channels,ap))<0)
  157. return(exit_status);
  158. if((exit_status = read_special_data((*cmdline)[0],dz))<0)
  159. return(exit_status);
  160. (*cmdline)++;
  161. (*cmdlinecnt)--;
  162. }
  163. return(FINISHED);
  164. }
  165. /************************ READ_FORMANT_QKSRCH_FLAG *********************/
  166. int read_formant_qksrch_flag(char ***cmdline,int *cmdlinecnt,dataptr dz)
  167. {
  168. if(!sloom) {
  169. if(*cmdlinecnt <= 0)
  170. return(FINISHED);
  171. if(!strcmp((*cmdline)[0],"-i")) {
  172. dz->deal_with_chan_data = IGNORE_ACTUAL_CHAN_FRQS;
  173. (*cmdline)++;
  174. (*cmdlinecnt)--;
  175. }
  176. } else {
  177. ((*cmdline)[0])++; /* Skip numericval marker */
  178. switch((*cmdline)[0][0]) {
  179. case('0'): break; /* default value remains set */
  180. case('1'): dz->deal_with_chan_data = IGNORE_ACTUAL_CHAN_FRQS; break;
  181. default:
  182. sprintf(errstr,"Unknown data at formant_quicksearch position in data sent from TK\n");
  183. return(DATA_ERROR);
  184. }
  185. (*cmdline)++;
  186. (*cmdlinecnt)--;
  187. }
  188. return(FINISHED);
  189. }
  190. /************************ HOUSEKEEP_FILES *********************/
  191. int do_housekeep_files(char *filename,dataptr dz)
  192. {
  193. int exit_status;
  194. if(dz->process==HOUSE_BUNDLE) {
  195. if(dz->wordstor!=NULL)
  196. free_wordstors(dz);
  197. dz->all_words = 0;
  198. if((exit_status = store_filename(filename,dz))<0)
  199. return(exit_status);
  200. }
  201. if(!sloom) { /* cmdline uses infilename as default outname */
  202. if((exit_status = setup_file_outname_where_ness(filename,dz))<0)
  203. return(exit_status);
  204. }
  205. if(dz->process==HOUSE_COPY) {
  206. if(dz->mode!=COPYSF) {
  207. if(dz->infile->filetype!=SNDFILE) {
  208. sprintf(errstr,"This process only works with soundfiles.\n");
  209. return(DATA_ERROR);
  210. }
  211. return(FINISHED);
  212. }
  213. switch(dz->infile->filetype) {
  214. case(WORDLIST): dz->process_type = TO_TEXTFILE; dz->outfiletype = TEXTFILE_OUT; break;
  215. case(SNDFILE): dz->process_type = EQUAL_SNDFILE; dz->outfiletype = SNDFILE_OUT; break;
  216. case(ANALFILE): dz->process_type = EQUAL_ANALFILE; dz->outfiletype = ANALFILE_OUT; break;
  217. case(PITCHFILE): dz->process_type = PITCH_TO_PITCH; dz->outfiletype = PITCH_OUT; break;
  218. case(TRANSPOSFILE): dz->process_type = PITCH_TO_PITCH; dz->outfiletype=PITCH_OUT; dz->is_transpos=TRUE; break;
  219. case(FORMANTFILE): dz->process_type = EQUAL_FORMANTS; dz->outfiletype = FORMANTS_OUT; break;
  220. case(ENVFILE): dz->process_type = EQUAL_ENVFILE; dz->outfiletype = ENVFILE_OUT; break;
  221. default:
  222. sprintf(errstr,"Impossible infile type: assign_copy_constants()\n");
  223. return(PROGRAM_ERROR);
  224. }
  225. }
  226. return(FINISHED);
  227. }
  228. /************************* CHECK_REPITCH_TYPE **********************/
  229. int check_repitch_type(dataptr dz)
  230. {
  231. if(dz->infile->filetype==PITCHFILE && dz->mode==TTT) {
  232. sprintf(errstr,"Cannot do a tranpos/transpos operation on a pitchfile\n");
  233. return(DATA_ERROR);
  234. } else if(dz->infile->filetype==TRANSPOSFILE) {
  235. if(dz->mode==PPT) {
  236. sprintf(errstr,"Can't do a pitch/pitch operation on a transposition file.\n");
  237. return(DATA_ERROR);
  238. } else if(dz->mode==PTP) {
  239. sprintf(errstr,"Can't do a pitch/transpos starting with a transposition file.\n");
  240. return(DATA_ERROR);
  241. }
  242. }
  243. return(FINISHED);
  244. }
  245. /****************************** EXCEPTIONAL_REPITCH_VALIDITY_CHECK *********************************/
  246. int exceptional_repitch_validity_check(int *is_valid,dataptr dz)
  247. {
  248. switch(dz->mode) {
  249. case(PPT):
  250. case(PTP):
  251. if(dz->could_be_pitch==FALSE)
  252. *is_valid = FALSE; /*RWD was == both times */
  253. break;
  254. case(TTT):
  255. if(dz->could_be_transpos==FALSE)
  256. *is_valid = FALSE;
  257. break;
  258. default:
  259. sprintf(errstr,"Unknown case in exceptional_repitch_validity_check()\n");
  260. return(PROGRAM_ERROR);
  261. }
  262. return(FINISHED);
  263. }
  264. /****************************** SETUP_BRKTABLESIZES *********************************/
  265. int setup_brktablesizes(infileptr infile_info,dataptr dz)
  266. {
  267. if(could_be_transpos_and_or_pitch_infiletype(dz->infile->filetype)) {
  268. if(dz->input_data_type==BRKFILES_ONLY
  269. || dz->input_data_type==ALL_FILES
  270. || dz->input_data_type==DB_BRKFILES_ONLY
  271. || dz->input_data_type==UNRANGED_BRKFILE_ONLY) { /* is NOT pitch or transpos data */
  272. if(dz->extrabrkno < 0 || dz->brk==NULL) {
  273. sprintf(errstr,"Attempt to use brksize before allocated:1: setup_brktablesizes()\n");
  274. return(PROGRAM_ERROR);
  275. }
  276. dz->brksize[dz->extrabrkno] = infile_info->brksize;
  277. } else /* must be a pitch or transpos process */
  278. dz->tempsize = infile_info->brksize;
  279. } else if(is_brkfile_infiletype(dz->infile->filetype)) {
  280. if(dz->extrabrkno < 0 || dz->brk==NULL) {
  281. sprintf(errstr,"Attempt to use brksize before allocated:2: setup_brktablesizes()\n");
  282. return(PROGRAM_ERROR);
  283. }
  284. dz->brksize[dz->extrabrkno] = infile_info->brksize;
  285. }
  286. return(FINISHED);
  287. }
  288. /****************************** STORE_FILENAME *********************************/
  289. int store_filename(char *filename,dataptr dz)
  290. {
  291. if(dz->wordstor != NULL) {
  292. sprintf(errstr,"Cannot store filename: wordstor already allocated.\n");
  293. return(PROGRAM_ERROR);
  294. }
  295. if((dz->wordstor = (char **)malloc(sizeof(char *)))==NULL) {
  296. sprintf(errstr,"Cannot store filename.\n");
  297. return(MEMORY_ERROR);
  298. }
  299. if((dz->wordstor[0] = (char *)malloc((strlen(filename)+1) * sizeof(char)))==NULL) {
  300. sprintf(errstr,"Cannot store filename.\n");
  301. return(MEMORY_ERROR);
  302. }
  303. if(strcpy(dz->wordstor[0],filename)!= dz->wordstor[0]) {
  304. sprintf(errstr,"Failed to copy filename to store.\n");
  305. return(PROGRAM_ERROR);
  306. }
  307. dz->all_words++;
  308. return(FINISHED);
  309. }
  310. /****************************** STORE_FURTHER_FILENAME *********************************/
  311. int store_further_filename(int n,char *filename,dataptr dz)
  312. {
  313. if(dz->wordstor == NULL) {
  314. if((dz->wordstor = (char **)malloc((n+1) *sizeof(char *)))==NULL) {
  315. sprintf(errstr,"Cannot store further filename.\n");
  316. return(MEMORY_ERROR);
  317. }
  318. } else {
  319. if((dz->wordstor = (char **)realloc((dz->wordstor),(n+1) *sizeof(char *)))==NULL) {
  320. sprintf(errstr,"Cannot store further filename.\n");
  321. return(MEMORY_ERROR);
  322. }
  323. }
  324. if((dz->wordstor[n] = (char *)malloc((strlen(filename)+1) * sizeof(char)))==NULL) {
  325. sprintf(errstr,"Cannot store further filename.\n");
  326. return(MEMORY_ERROR);
  327. }
  328. if(strcpy(dz->wordstor[n],filename)!=dz->wordstor[n]) {
  329. sprintf(errstr,"Failed to copy filename to store.\n");
  330. return(PROGRAM_ERROR);
  331. }
  332. dz->all_words++;
  333. return(FINISHED);
  334. }
  335. /************************ COUNT_AND_ALLOCATE_FOR_INFILES *********************/
  336. int count_and_allocate_for_infiles(int argc,char *argv[],dataptr dz)
  337. {
  338. int exit_status;
  339. switch(dz->input_data_type) {
  340. case(NO_FILE_AT_ALL): /* processes actually do NOT USE the input file */
  341. dz->infilecnt = 0;
  342. break;
  343. case(SNDFILES_ONLY): case(ANALFILE_ONLY):
  344. case(MIXFILES_ONLY): case(SNDLIST_ONLY): case(WORDLIST_ONLY):
  345. case(ENVFILES_ONLY): case(BRKFILES_ONLY): case(DB_BRKFILES_ONLY):
  346. case(FORMANTFILE_ONLY): case(PITCHFILE_ONLY): case(PITCH_OR_TRANSPOS):
  347. case(SND_OR_MIXLIST_ONLY): case(SND_SYNC_OR_MIXLIST_ONLY): case(UNRANGED_BRKFILE_ONLY):
  348. dz->infilecnt = 1;
  349. break;
  350. case(ALL_FILES): /* i.e. processes accept and use any type of file */
  351. switch(dz->process) {
  352. case(HOUSE_BUNDLE):
  353. if((exit_status = count_bundle_files(argc,argv,dz))<0)
  354. return(exit_status);
  355. break;
  356. case(INFO_DIFF): dz->infilecnt = 2; break;
  357. default: dz->infilecnt = 1; break;
  358. }
  359. break;
  360. case(TWO_SNDFILES): case(SNDFILE_AND_ENVFILE): case(SNDFILE_AND_BRKFILE):
  361. case(SNDFILE_AND_DB_BRKFILE): case(TWO_ANALFILES): case(ANAL_AND_FORMANTS):
  362. case(PITCH_AND_FORMANTS): case(PITCH_AND_PITCH): case(PITCH_AND_TRANSPOS):
  363. case(TRANSPOS_AND_TRANSPOS): case(ANAL_WITH_PITCHDATA): case(ANAL_WITH_TRANSPOS):
  364. case(SNDFILE_AND_UNRANGED_BRKFILE):
  365. dz->infilecnt = 2;
  366. break;
  367. case(THREE_ANALFILES):
  368. //TW NEW
  369. case(PFE):
  370. dz->infilecnt = 3;
  371. break;
  372. case(ONE_OR_MANY_SNDFILES):
  373. //TW NEW
  374. case(ONE_OR_MORE_SNDSYS):
  375. if((exit_status = count_infiles(argc,argv,dz))<0)
  376. return(exit_status);
  377. break;
  378. case(MANY_SNDFILES): case(MANY_ANALFILES): case(ANY_NUMBER_OF_ANY_FILES):
  379. if((exit_status = count_infiles(argc,argv,dz))<0)
  380. return(exit_status);
  381. if(dz->infilecnt < 2) {
  382. sprintf(errstr,"Insufficient input files for this process\n");
  383. return(USAGE_ONLY);
  384. }
  385. break;
  386. default:
  387. sprintf(errstr,"Unknown input_data_type: count_and_allocate_for_infiles()\n");
  388. return(PROGRAM_ERROR);
  389. }
  390. return allocate_filespace(dz);
  391. }
  392. /************************ COUNT_INFILES *********************/
  393. int count_infiles(int argc,char *argv[],dataptr dz)
  394. {
  395. int files_to_skip = 1, diff;
  396. int other_unflagged_items;
  397. //TW NEW CODE OK
  398. if(dz->outfiletype != NO_OUTPUTFILE)
  399. files_to_skip++;
  400. argc -= files_to_skip;
  401. argv += files_to_skip;
  402. if(argc<0) {
  403. sprintf(errstr,"Insufficient cmdline parameters.\n");
  404. return(USAGE_ONLY);
  405. }
  406. other_unflagged_items = 0;
  407. while(argc > 0) { /* count all unflagged items after outfile */
  408. if(*(argv[0])!='-' || !isalpha(argv[0][1]))
  409. other_unflagged_items++; /* options, variants, formants, and formant_qiksrch are flagged */
  410. argc--;
  411. argv++;
  412. }
  413. if(dz->application->special_data) /* subtract any special data item : not flagged */
  414. other_unflagged_items--;
  415. if((diff = other_unflagged_items - dz->application->param_cnt)<0) {
  416. sprintf(errstr,"Insufficient cmdline parameters.\n");
  417. return(USAGE_ONLY);
  418. }
  419. dz->infilecnt = diff + 1; /* i.e. plus first infile */
  420. return(FINISHED);
  421. }
  422. /************************ COUNT_BUNDLE_FILES *********************/
  423. int count_bundle_files(int argc,char *argv[],dataptr dz)
  424. {
  425. /*int files_to_skip = 1;*/
  426. int orig_argc = argc;
  427. if(argc<1) {
  428. sprintf(errstr,"Insufficient cmdline parameters.\n");
  429. return(USAGE_ONLY);
  430. }
  431. while(argc > 0) {
  432. if(*(argv[0])=='-') {
  433. sprintf(errstr,"Invalid flag or parameter on cmdline.\n");
  434. return(DATA_ERROR);
  435. }
  436. argc--;
  437. argv++;
  438. }
  439. dz->infilecnt = orig_argc - 1; /* i.e. minus outfile */
  440. return(FINISHED);
  441. }
  442. /******************************* PUT_DEFAULT_VALS_IN_ALL_PARAMS **************************/
  443. void put_default_vals_in_all_params(dataptr dz)
  444. {
  445. aplptr ap = dz->application;
  446. int n;
  447. for(n=0;n<ap->total_input_param_cnt;n++) {
  448. dz->param[n] = ap->default_val[n];
  449. if(dz->is_int[n])
  450. dz->iparam[n] = round(dz->param[n]);
  451. }
  452. }
  453. /************************ MAKE_INITIAL_CMDLINE_CHECK *********************/
  454. int make_initial_cmdline_check(int *argc,char **argv[])
  455. {
  456. int exit_status;
  457. if(*argc<4) { /* INITIAL CHECK OF CMDLINE OR PRE-CMDLINE DATA */
  458. /*RWD May 2005*/
  459. fprintf(stdout,"CDP Release 7.1 2016\n");
  460. if((exit_status = usage(*argc,*argv))<0)
  461. return(exit_status);
  462. }
  463. (*argv)++;
  464. (*argc)--;
  465. return(FINISHED);
  466. }
  467. /************************ TEST_APPLICATION_VALIDITY *********************/
  468. int test_application_validity(infileptr infile_info,int process,int *valid,dataptr dz)
  469. {
  470. int exit_status;
  471. int is_valid = valid_application(process,valid);
  472. if((dz->process==REPITCH || process==REPITCHB) && is_a_text_input_filetype(infile_info->filetype) && is_valid) {
  473. if((exit_status = exceptional_repitch_validity_check(&is_valid,dz))<0)
  474. return(exit_status);
  475. }
  476. if(!is_valid) { /* GUI: invalid applics WON'T BE DISPLAYED on menus */
  477. sprintf(errstr,"Application doesn't work with this type of infile.\n");
  478. return(USAGE_ONLY); /* validity can be checked from dz->valid bitflags */
  479. }
  480. return(FINISHED);
  481. }
  482. /************************ PARSE_INFILE_AND_HONE_TYPE *********************/
  483. int parse_infile_and_hone_type(char *filename,int *valid,dataptr dz)
  484. {
  485. int exit_status;
  486. infileptr infile_info;
  487. if(!sloom) {
  488. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  489. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test TK data.");
  490. return(MEMORY_ERROR);
  491. }
  492. if((exit_status = cdparse(filename,infile_info))<0)
  493. return(exit_status);
  494. if((exit_status = establish_application_validities(infile_info->filetype,infile_info->channels,valid))<0)
  495. return(exit_status);
  496. if((exit_status = test_application_validity(infile_info,dz->process,valid,dz))<0)
  497. return(exit_status);
  498. if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0)
  499. return(exit_status);
  500. free(infile_info);
  501. }
  502. /* KNOWING POSSIBLE TYPE OF INFILE, AND TYPE NEEDED BY PROCESS, HONE TYPE */
  503. if(is_a_text_input_filetype(dz->infile->filetype)) {
  504. if((exit_status = redefine_textfile_types(dz))<0)
  505. return(exit_status);
  506. }
  507. switch(dz->process) {
  508. case(HOUSE_COPY): case(HOUSE_CHANS): case(HOUSE_EXTRACT): case(HOUSE_SPEC): case(HOUSE_BUNDLE):
  509. case(HOUSE_SORT): case(HOUSE_DISK):
  510. case(HOUSE_GATE):
  511. if((exit_status = do_housekeep_files(filename,dz))<0)
  512. return(exit_status);
  513. break;
  514. case(INFO_TIMELIST): case(MIXDUMMY):
  515. case(INFO_LOUDLIST):
  516. case(MIX_ON_GRID):
  517. case(MIX_AT_STEP): case(TOPNTAIL_CLICKS):
  518. case(MAKE_VFILT):
  519. dz->all_words = 0;
  520. if((exit_status = store_filename(filename,dz))<0)
  521. return(exit_status);
  522. break;
  523. case(MOD_LOUDNESS):
  524. if(dz->mode==LOUDNESS_LOUDEST || dz->mode==LOUDNESS_EQUALISE) {
  525. dz->all_words = 0;
  526. if((exit_status = store_filename(filename,dz))<0)
  527. return(exit_status);
  528. }
  529. break;
  530. case(RANDCUTS): case(RANDCHUNKS):
  531. if(!sloom) {
  532. dz->all_words = 0;
  533. if((exit_status = store_filename(filename,dz))<0)
  534. return(exit_status);
  535. }
  536. break;
  537. case(REPITCH): case(REPITCHB):
  538. if(!is_a_text_input_filetype(dz->infile->filetype)) {
  539. if((exit_status = check_repitch_type(dz))<0)
  540. return(exit_status);
  541. }
  542. break;
  543. }
  544. if(anal_infiles) {
  545. if((exit_status = set_chunklens_and_establish_windowbufs(dz))<0)
  546. return(exit_status);
  547. }
  548. return(FINISHED);
  549. }
  550. /************************* SET_CHUNKLENS_AND_ESTABLISH_WINDOWBUFS **********************/
  551. int set_chunklens_and_establish_windowbufs(dataptr dz)
  552. {
  553. int exit_status;
  554. int n;
  555. switch(dz->infile->filetype) {
  556. case(ANALFILE):
  557. dz->clength = dz->wanted / 2;
  558. dz->chwidth = dz->nyquist/(double)(dz->clength-1);
  559. dz->halfchwidth = dz->chwidth/2.0;
  560. if((exit_status = float_array(&dz->amp,dz->clength))<0)
  561. return(exit_status);
  562. if((exit_status = float_array(&dz->freq,dz->clength))<0)
  563. return(exit_status);
  564. break;
  565. case(PITCHFILE):
  566. case(TRANSPOSFILE):
  567. dz->wanted = dz->infile->origchans;
  568. dz->clength = dz->infile->origchans / 2;
  569. dz->chwidth = dz->nyquist/(double)(dz->clength-1);
  570. dz->halfchwidth = dz->chwidth/2.0;
  571. if((exit_status = float_array(&dz->amp,dz->clength))<0)
  572. return(exit_status);
  573. if((exit_status = float_array(&dz->freq,dz->clength))<0)
  574. return(exit_status);
  575. break;
  576. case(FORMANTFILE):
  577. dz->wanted = dz->infile->specenvcnt;
  578. break;
  579. }
  580. for(n=0;n<dz->extra_bufcnt;n++) {
  581. if((exit_status = float_array(&(dz->windowbuf[n]),dz->wanted))<0)
  582. return(exit_status);
  583. }
  584. return(FINISHED);
  585. }
  586. /******************************** SETUP_FILE_OUTNAME_WHERE_NESS ************************
  587. *
  588. * CMDLINE uses infilename as basis of outfilename(s)
  589. * TK uses the default outfilename instead
  590. */
  591. int setup_file_outname_where_ness(char *filename,dataptr dz)
  592. {
  593. int exit_status;
  594. switch(dz->process) {
  595. case(RANDCUTS):
  596. case(RANDCHUNKS):
  597. case(HOUSE_CHANS):
  598. case(EDIT_CUTMANY):
  599. case(MANY_ZCUTS):
  600. case(SYLLABS):
  601. case(SHUDDER):
  602. case(JOIN_SEQ):
  603. case(JOIN_SEQDYN):
  604. case(SYNTH_WAVE): case(SYNTH_NOISE): case(SYNTH_SIL): case(CLICK):
  605. case(ENV_CREATE): case(ENV_EXTRACT): case(MULTI_SYN):
  606. case(FORMANTS): case(FMNTSEE):
  607. case(P_SEE): case(P_HEAR):
  608. case(PVOC_ANAL): case(PVOC_SYNTH):
  609. case(P_SYNTH): case(P_VOWELS): case(ANALENV):
  610. case(LEVEL): case(ENVSYN):
  611. dz->all_words = 0;
  612. if((exit_status = store_filename(filename,dz))<0)
  613. return(exit_status);
  614. break;
  615. case(RRRR_EXTEND):
  616. if(dz->mode == 2) {
  617. dz->all_words = 0;
  618. if((exit_status = store_filename(filename,dz))<0)
  619. return(exit_status);
  620. }
  621. break;
  622. case(HOUSE_COPY):
  623. if(dz->mode == DUPL) {
  624. dz->all_words = 0;
  625. if((exit_status = store_filename(filename,dz))<0)
  626. return(exit_status);
  627. }
  628. break;
  629. case(HOUSE_EXTRACT):
  630. if(dz->mode==HOUSE_CUTGATE) {
  631. dz->all_words = 0;
  632. if((exit_status = store_filename(filename,dz))<0)
  633. return(exit_status);
  634. }
  635. break;
  636. case(HOUSE_SORT):
  637. if((exit_status = store_further_filename(dz->all_words,filename,dz))<0)
  638. return(exit_status);
  639. break;
  640. case(HF_PERM1):
  641. case(HF_PERM2):
  642. if(dz->mode == HFP_SNDSOUT) {
  643. dz->all_words = 0;
  644. if((exit_status = store_filename(filename,dz))<0)
  645. return(exit_status);
  646. }
  647. break;
  648. case(SYNTH_SPEC):
  649. case(TWIXT):
  650. case(HOUSE_GATE):
  651. case(TIME_GRID):
  652. case(FORMSEE):
  653. case(MAKE):
  654. dz->all_words = 0;
  655. if((exit_status = store_filename(filename,dz))<0)
  656. return(exit_status);
  657. break;
  658. case(MAKE_VFILT):
  659. if((exit_status = store_further_filename(dz->all_words,filename,dz))<0)
  660. return(exit_status);
  661. break;
  662. case(MOD_LOUDNESS):
  663. if(dz->mode==LOUDNESS_LOUDEST || dz->mode==LOUDNESS_EQUALISE) {
  664. if((exit_status = store_further_filename(dz->all_words,filename,dz))<0)
  665. return(exit_status);
  666. }
  667. break;
  668. case(MOD_RADICAL):
  669. //TW Store outputfile name, for use with tempfile mechanism to avoic sndseek problems
  670. if(dz->mode==MOD_LOBIT || dz->mode==MOD_LOBIT2) {
  671. dz->all_words = 0;
  672. if((exit_status = store_filename(filename,dz))<0)
  673. return(exit_status);
  674. }
  675. break;
  676. case(BRASSAGE): case(SAUSAGE):
  677. //TW Store outputfile name, for use with tempfile mechanism to avoic sndseek problems
  678. dz->all_words = 0;
  679. if((exit_status = store_filename(filename,dz))<0)
  680. return(exit_status);
  681. break;
  682. }
  683. return(FINISHED);
  684. }
  685. /****************************** SET_SPECIAL_PROCESS_SIZES *********************************/
  686. int set_special_process_sizes(dataptr dz)
  687. {
  688. int maxsize, minsize;
  689. int n;
  690. switch(dz->process) {
  691. case(SUM): /* progs where outsize is maximum of insizes */
  692. case(MAX):
  693. maxsize = dz->insams[0];
  694. for(n=0;n<dz->infilecnt;n++)
  695. maxsize = max(dz->insams[n],maxsize);
  696. dz->wlength = maxsize/dz->wanted;
  697. break;
  698. case(CROSS): /* progs where outsize is minimum of insizes */
  699. case(MEAN):
  700. case(VOCODE):
  701. case(LEAF):
  702. minsize = dz->insams[0];
  703. for(n=1;n<dz->infilecnt;n++)
  704. minsize = min(dz->insams[n],minsize);
  705. dz->wlength = minsize/dz->wanted;
  706. break;
  707. }
  708. return(FINISHED);
  709. }
  710. /************************ COPY_PARSE_INFO_TO_MAIN_STRUCTURE *********************/
  711. int copy_parse_info_to_main_structure(infileptr infile_info,dataptr dz)
  712. {
  713. if(dz->infilecnt < 1 || dz->insams==NULL) {
  714. sprintf(errstr,"Attempt to use file arrays before allocated: copy_parse_info_to_main_structure()\n");
  715. return(PROGRAM_ERROR);
  716. }
  717. dz->infile->filetype = infile_info->filetype;
  718. /*dz->infilesize[0] = infile_info->infilesize;*/
  719. dz->insams[0] = infile_info->insams;
  720. dz->infile->srate = infile_info->srate;
  721. dz->infile->channels = infile_info->channels;
  722. dz->infile->stype = infile_info->stype;
  723. dz->infile->origstype = infile_info->origstype;
  724. dz->infile->origrate = infile_info->origrate;
  725. dz->infile->Mlen = infile_info->Mlen;
  726. dz->infile->Dfac = infile_info->Dfac;
  727. dz->infile->origchans = infile_info->origchans;
  728. dz->infile->specenvcnt = infile_info->specenvcnt;
  729. dz->specenvcnt = infile_info->specenvcnt;
  730. dz->wanted = infile_info->wanted;
  731. dz->wlength = infile_info->wlength;
  732. dz->out_chans = infile_info->out_chans;
  733. dz->descriptor_samps = infile_info->descriptor_samps; /*RWD ???? */
  734. dz->is_transpos = infile_info->is_transpos;
  735. dz->could_be_transpos = infile_info->could_be_transpos;
  736. dz->could_be_pitch = infile_info->could_be_pitch;
  737. dz->different_srates = infile_info->different_srates;
  738. dz->duplicate_snds = infile_info->duplicate_snds;
  739. dz->numsize = infile_info->numsize;
  740. dz->linecnt = infile_info->linecnt;
  741. dz->all_words = infile_info->all_words;
  742. dz->infile->arate = infile_info->arate;
  743. dz->frametime = infile_info->frametime;
  744. dz->infile->window_size = infile_info->window_size;
  745. dz->nyquist = infile_info->nyquist;
  746. dz->duration = infile_info->duration;
  747. dz->minbrk = infile_info->minbrk;
  748. dz->maxbrk = infile_info->maxbrk;
  749. dz->minnum = infile_info->minnum;
  750. dz->maxnum = infile_info->maxnum;
  751. if(dz->process==MIXDUMMY || dz->process==HOUSE_BUNDLE || dz->process==HOUSE_SORT
  752. || dz->process==MIX_ON_GRID || dz->process==ADDTOMIX || dz->process==MIX_AT_STEP
  753. || dz->process==BATCH_EXPAND || dz->process==MIX_MODEL)
  754. return FINISHED;
  755. return setup_brktablesizes(infile_info,dz);
  756. }
  757. /************************ ALLOCATE_FILESPACE *********************/
  758. int allocate_filespace(dataptr dz)
  759. {
  760. int n;
  761. int zerofiles = 0;
  762. /* BELOW CHANGED FROM < 0: JAN 2000 */
  763. if(dz->infilecnt <= 0) {
  764. zerofiles = 1;
  765. dz->infilecnt = 1; /* always want to allocate pointers */
  766. }
  767. /*
  768. if((dz->infilesize = (int *)malloc(dz->infilecnt * sizeof(int)))==NULL) {
  769. sprintf(errstr,"INSUFFICIENT MEMORY for infilesize array.\n");
  770. return(MEMORY_ERROR);
  771. }
  772. */
  773. if((dz->insams = (int *)malloc(dz->infilecnt * sizeof(int)))==NULL) {
  774. sprintf(errstr,"INSUFFICIENT MEMORY for infile-sampsize array.\n");
  775. return(MEMORY_ERROR);
  776. }
  777. if((dz->ifd = (int *)malloc(dz->infilecnt * sizeof(int)))==NULL) {
  778. sprintf(errstr,"INSUFFICIENT MEMORY for infile poniters array.\n");
  779. return(MEMORY_ERROR);
  780. }
  781. for(n=0;n<dz->infilecnt;n++) {
  782. dz->ifd[n] = -1;
  783. dz->insams[n] = 0L;
  784. /*dz->infilesize[n] = 0L;*/
  785. }
  786. if(zerofiles)
  787. dz->infilecnt = 0;
  788. return(FINISHED);
  789. }
  790. /************************ HANDLE_EXTRA_INFILES *********************/
  791. int handle_extra_infiles(char ***cmdline,int *cmdlinecnt,dataptr dz)
  792. {
  793. /* OPEN ANY FURTHER INFILES, CHECK COMPATIBILITY, STORE DATA AND INFO */
  794. int exit_status;
  795. int n, k = 0;
  796. char *filename;
  797. if(dz->process == ADDTOMIX || dz->process == BATCH_EXPAND || dz->process == MIX_MODEL)
  798. k = dz->all_words - 1;
  799. if(dz->infilecnt > 1) {
  800. for(n=1;n<dz->infilecnt;n++) {
  801. filename = (*cmdline)[0];
  802. switch(dz->process) {
  803. case(ADDTOMIX):
  804. case(BATCH_EXPAND):
  805. case(MIX_MODEL):
  806. if((exit_status = store_further_filename(n+k,filename,dz))<0)
  807. return(exit_status);
  808. if((exit_status = handle_other_infile(n,filename,dz))<0)
  809. return(exit_status);
  810. break;
  811. case(MIX_ON_GRID):
  812. case(MIX_AT_STEP):
  813. if((exit_status = store_further_filename(n,filename,dz))<0)
  814. return(exit_status);
  815. break;
  816. case(HOUSE_BUNDLE):
  817. case(MIXDUMMY):
  818. if((exit_status = store_further_filename(n,filename,dz))<0)
  819. return(exit_status);
  820. break;
  821. case(INFO_TIMELIST):
  822. case(INFO_LOUDLIST):
  823. if((exit_status = store_further_filename(n,filename,dz))<0)
  824. return(exit_status);
  825. if((exit_status = handle_other_infile(n,filename,dz))<0)
  826. return(exit_status);
  827. break;
  828. case(MOD_LOUDNESS):
  829. if(dz->mode==LOUDNESS_LOUDEST || dz->mode==LOUDNESS_EQUALISE) {
  830. if((exit_status = store_further_filename(n,filename,dz))<0)
  831. return(exit_status);
  832. }
  833. if((exit_status = handle_other_infile(n,filename,dz))<0)
  834. return(exit_status);
  835. break;
  836. default:
  837. if((exit_status = handle_other_infile(n,filename,dz))<0)
  838. return(exit_status);
  839. break;
  840. }
  841. (*cmdline)++;
  842. (*cmdlinecnt)--;
  843. }
  844. if((exit_status = set_special_process_sizes(dz))<0)
  845. return(exit_status);
  846. }
  847. if(dz->process == BATCH_EXPAND || dz->process == MIX_MODEL)
  848. dz->itemcnt = dz->infilecnt - 1;
  849. return(FINISHED);
  850. }
  851. /************************ HANDLE_OUTFILE *********************/
  852. /* RWD I have a theory: this could be split into two functions where indicated:
  853. * handle_outfile_name()
  854. * and handle_outfile()
  855. * and then handle_outfile() can be relocated at the end of param_preprocess(),
  856. * wher it belongs; and all these tests can be eliminated!
  857. */
  858. /************************ HANDLE_OUTFILE *********************/
  859. int handle_outfile(int *cmdlinecnt,char ***cmdline,int is_launched,dataptr dz)
  860. {
  861. int exit_status;
  862. char *filename = NULL;
  863. char *filename2;
  864. int n;
  865. int look_for_float_flag = 0;
  866. if(dz->outfiletype==NO_OUTPUTFILE) {
  867. /* Look at all those "NO_OUTPUTFILE" processes which actually give a sound output (!!! it's a int story!) */
  868. /* Some of these processes have NO output file name in the cmdline situation but DO have an outfilename in SLOOM */
  869. /* as all SLOOM processes have an outfilename */
  870. if(sloom) {
  871. if (dz->process == RANDCUTS
  872. || dz->process == RANDCHUNKS
  873. || dz->process == HOUSE_CHANS
  874. || (dz->process == HOUSE_EXTRACT && dz->mode == HOUSE_CUTGATE)) {
  875. look_for_float_flag = 1;
  876. }
  877. }
  878. /* Some of these processes DO have an output file name in the cmdline situation (and, as always, in SLOOM) */
  879. if (dz->process == MIXINBETWEEN
  880. || dz->process == CYCINBETWEEN
  881. || dz->process == SYNTH_SPEC
  882. || dz->process == HOUSE_GATE
  883. || (dz->process == HF_PERM1 && dz->mode == HFP_SNDSOUT)
  884. || (dz->process == HF_PERM2 && dz->mode == HFP_SNDSOUT)) {
  885. look_for_float_flag = 1;
  886. }
  887. } else if(dz->outfiletype == SNDFILE_OUT) {
  888. /* Look at all processes with a SOUNDFILE output: all such processes have an output file name in the cmdline */
  889. look_for_float_flag = 1;
  890. }
  891. if(look_for_float_flag) {
  892. /* For all these cases, check if the output file is flagged as float, and strip any flag */
  893. if(!sloom && (*cmdlinecnt<=0)) {
  894. sprintf(errstr,"Insufficient cmdline parameters.\n");
  895. return(USAGE_ONLY);
  896. }
  897. filename = (*cmdline)[0];
  898. if(filename[0]=='-' && filename[1]=='f') {
  899. dz->floatsam_output = 1;
  900. dz->true_outfile_stype = SAMP_FLOAT;
  901. filename+= 2;
  902. }
  903. }
  904. if(dz->outfiletype==NO_OUTPUTFILE) {
  905. /* These processes generate an output which is NOT a soundfile, and hence have an output file name on the cmd line */
  906. if(dz->process == MAKE_VFILT
  907. || (dz->process == MOD_PITCH && (dz->mode == MOD_TRANSPOS_INFO || dz->mode == MOD_TRANSPOS_SEMIT_INFO))) {
  908. if(!sloom && (*cmdlinecnt<=0)) {
  909. sprintf(errstr,"Insufficient cmdline parameters.\n");
  910. return(USAGE_ONLY);
  911. }
  912. filename = (*cmdline)[0];
  913. if(filename[0]=='-' && filename[1]=='f') {
  914. sprintf(errstr,"-f flag used incorrectly on command line (output is not a sound file).\n");
  915. return(USAGE_ONLY);
  916. }
  917. }
  918. }
  919. if (!sloom) {
  920. if(dz->process == MAKE) {
  921. if((filename = (*cmdline)[0]) == NULL) {
  922. return(USAGE_ONLY);
  923. }
  924. }
  925. if(dz->process == MAKE || dz->process == FORMSEE) {
  926. if((exit_status = setup_file_outname_where_ness(filename,dz))<0) {
  927. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  928. return(exit_status);
  929. }
  930. }
  931. if (dz->process == MAKE) {
  932. if((filename = get_other_filename_x(filename,'1')) == NULL) {
  933. sprintf(errstr,"Insufficient memory to store modified outfilename.\n");
  934. return MEMORY_ERROR;
  935. }
  936. }
  937. }
  938. /* in all these cases we wish to remember the name of the output filename from the cmdline */
  939. if(dz->process == ANALENV
  940. || dz->process == BRASSAGE
  941. || dz->process == CLICK
  942. || dz->process == EDIT_CUTMANY
  943. || dz->process == MANY_ZCUTS
  944. || dz->process == ENV_CREATE
  945. || dz->process == ENV_EXTRACT
  946. || dz->process == FMNTSEE
  947. || dz->process == FORMANTS
  948. || ((dz->process == FORMSEE) && sloom)
  949. || dz->process == HF_PERM1
  950. || dz->process == HF_PERM2
  951. || dz->process == JOIN_SEQ
  952. || dz->process == JOIN_SEQDYN
  953. || dz->process == LEVEL
  954. || ((dz->process == MAKE) && sloom)
  955. || dz->process == P_HEAR
  956. || dz->process == P_SEE
  957. || dz->process == P_SYNTH
  958. || dz->process == P_VOWELS
  959. || dz->process == PVOC_ANAL
  960. || dz->process == PVOC_SYNTH
  961. || dz->process == SAUSAGE
  962. || dz->process == SHUDDER
  963. || dz->process == SYLLABS
  964. || dz->process == SYNTH_NOISE
  965. || dz->process == SYNTH_WAVE
  966. || dz->process == MULTI_SYN
  967. || dz->process == SYNTH_SIL
  968. || dz->process == TIME_GRID
  969. || dz->process == TWIXT
  970. || dz->process == ENVSYN
  971. || (dz->process == RRRR_EXTEND && dz->mode == 2)
  972. || (dz->process == MOD_RADICAL && (dz->mode == MOD_LOBIT || dz->mode == MOD_LOBIT2))) {
  973. /* all processes with a SOUNDFILE output have already been checked, so any outfiles found here must be NON soundfiles */
  974. if(filename == NULL) {
  975. if(!sloom && (*cmdlinecnt<=0)) {
  976. sprintf(errstr,"Insufficient cmdline parameters.\n");
  977. return(USAGE_ONLY);
  978. }
  979. filename = (*cmdline)[0];
  980. if(filename[0]=='-' && filename[1]=='f') {
  981. sprintf(errstr,"-f flag used incorrectly on command line (output is not a sound file).\n");
  982. return(USAGE_ONLY);
  983. }
  984. }
  985. if((exit_status = setup_file_outname_where_ness(filename,dz))<0) {
  986. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  987. return(exit_status);
  988. }
  989. }
  990. if (!sloom) {
  991. if (dz->process==SHUDDER || dz->process == BRASSAGE || dz->process == SAUSAGE || dz->process == FORMSEE) {
  992. if((filename = get_other_filename_x(filename,'1')) == NULL) {
  993. sprintf(errstr,"Insufficient memory to store modified outfilename.\n");
  994. return MEMORY_ERROR;
  995. }
  996. if((n = sndopenEx(dz->wordstor[0],0,CDP_OPEN_RDONLY)) >= 0) {
  997. sprintf(errstr,"Output file %s already exists",dz->wordstor[0]);
  998. if(sndcloseEx(n) < 0)
  999. strcat(errstr,": Cannot close the file.");
  1000. strcat(errstr,"\n");
  1001. return(GOAL_FAILED);
  1002. }
  1003. }
  1004. }
  1005. if(sloom) {
  1006. /* ALL sound loom processes have an output filename: so get it, if not already found */
  1007. if(filename == NULL)
  1008. filename = (*cmdline)[0];
  1009. /* These cases, on the soundloom , have ANALFILE & PITCHFILE output, and need to save or use outfilename as basis for additional outfile names */
  1010. if(dz->process==PITCH || dz->process==TRACK) {
  1011. dz->all_words = 0;
  1012. if((exit_status = store_filename(filename,dz))<0)
  1013. return(exit_status);
  1014. if((exit_status = do_extra_files(dz)) != FINISHED)
  1015. return(exit_status);
  1016. }
  1017. if(dz->process==HOUSE_COPY && dz->mode == DUPL) {
  1018. if((exit_status = setup_file_outname_where_ness(filename,dz))<0) {
  1019. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  1020. return(exit_status);
  1021. }
  1022. }
  1023. }
  1024. if(dz->outfiletype==NO_OUTPUTFILE) {
  1025. /* in these cases also, we wish to remember the name of the output file name on the cmdline. */
  1026. /* In non-soundloom case, some programs use the input filename to generate the outfilename, */
  1027. /* whereas Sound Loom ALWAYS has an outfilename which can be used. */
  1028. if(sloom) {
  1029. if(dz->process == MIXINBETWEEN || dz->process == CYCINBETWEEN) {
  1030. if((exit_status = read_new_filename(filename,dz))<0)
  1031. return(exit_status); /* read outfile as if it were special data */
  1032. } else if(dz->process != HF_PERM1 && dz->process != HF_PERM2) {
  1033. if((exit_status = setup_file_outname_where_ness(filename,dz))<0)
  1034. return(exit_status);
  1035. }
  1036. } else {
  1037. if(dz->process == MIXINBETWEEN || dz->process == CYCINBETWEEN) {
  1038. if(file_has_invalid_startchar(filename)) {
  1039. sprintf(errstr,"Filename %s has invalid start character(s)\n",filename);
  1040. return(DATA_ERROR);
  1041. }
  1042. if((exit_status = read_new_filename(filename,dz))<0)
  1043. return(exit_status); /* read outfile as if it were special data */
  1044. }
  1045. if(dz->process == SYNTH_SPEC || dz->process == MAKE_VFILT) {
  1046. if(file_has_invalid_startchar(filename)) {
  1047. sprintf(errstr,"Filename %s has invalid start character(s)\n",filename);
  1048. return(DATA_ERROR);
  1049. }
  1050. if((exit_status = setup_file_outname_where_ness(filename,dz))<0)
  1051. return(exit_status);
  1052. }
  1053. }
  1054. } else {
  1055. /* all other processes have an outputfile but not a sound outputfile (these were checked previously) */
  1056. /* so, if a filename does not yet exist, get it from the cmdline */
  1057. /* (all sloom outfilenames have already been read) */
  1058. if(filename == NULL) {
  1059. if(*cmdlinecnt<=0) {
  1060. sprintf(errstr,"Insufficient cmdline parameters.\n");
  1061. return(USAGE_ONLY);
  1062. }
  1063. filename = (*cmdline)[0];
  1064. if(filename[0]=='-' && filename[1]=='f') {
  1065. sprintf(errstr,"-f flag used incorrectly on command line (output is not a sound file).\n");
  1066. return(USAGE_ONLY);
  1067. }
  1068. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  1069. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  1070. return(DATA_ERROR);
  1071. }
  1072. }
  1073. }
  1074. //TW mechanics to setup sloom (and cmdline) compatible temp file: + normal usage SHUDDER
  1075. if(sloom) {
  1076. if (dz->process==SHUDDER || dz->process == BRASSAGE || dz->process == SAUSAGE || dz->process == FORMSEE
  1077. || dz->process == MAKE)
  1078. get_other_filename(filename,'1');
  1079. }
  1080. // DEC 2009 FIX
  1081. // if(dz->process==HOUSE_BUNDLE || dz->process==INFO_DIFF /* || (sloom && dz->process==PITCH) */
  1082. if(dz->process==HOUSE_BUNDLE
  1083. || dz->process==HOUSE_DUMP
  1084. || (dz->process == MOD_LOUDNESS && dz->mode == LOUDNESS_EQUALISE)) {
  1085. if((exit_status = store_further_filename(dz->all_words,filename,dz))<0)
  1086. return(exit_status);
  1087. }
  1088. if(!sloom) {
  1089. if(dz->process == EDIT_CUTMANY || dz->process == SYLLABS || dz->process == MANY_ZCUTS) {
  1090. n = strlen(filename);
  1091. if ((filename2 = (char *)malloc(n+2))==NULL) {
  1092. sprintf(errstr,"Insufficient memory to store output filename.\n");
  1093. return(MEMORY_ERROR);
  1094. }
  1095. strcpy(filename2,filename);
  1096. insert_new_number_at_filename_end(filename2,1,0);
  1097. filename = filename2;
  1098. }
  1099. }
  1100. /* EXCEPT IN THOSE CASES WHERE outfile creation has to be delayed, create the outfile NOW */
  1101. if(!(
  1102. dz->process == SYNTH_WAVE
  1103. || (!sloom && dz->process == HOUSE_COPY && dz->mode == DUPL)
  1104. || dz->process == MULTI_SYN
  1105. || dz->process == SYNTH_NOISE
  1106. || dz->process == SYNTH_SPEC
  1107. || dz->process == SYNTH_SIL
  1108. || dz->process == HOUSE_SPEC
  1109. || dz->process == HOUSE_CHANS
  1110. || dz->process == MIXINTERL
  1111. || (dz->process >= SIMPLE_TEX && dz->process <= TMOTIFSIN)
  1112. || (dz->process == MOD_SPACE && dz->mode == MOD_PAN)
  1113. || (dz->process == MOD_REVECHO && dz->mode == MOD_STADIUM)
  1114. || (dz->process == BRASSAGE && dz->mode == GRS_REVERB)
  1115. || (dz->process == BRASSAGE && dz->mode == GRS_BRASSAGE)
  1116. || (dz->process == BRASSAGE && dz->mode == GRS_FULL_MONTY)
  1117. || dz->process == SAUSAGE
  1118. || (dz->process == MIXMAX && dz->mode == MIX_LEVEL_ONLY)
  1119. || dz->process == AUTOMIX
  1120. || dz->process == MIX
  1121. || dz->process == MIXTWO
  1122. || dz->process == ENV_EXTRACT
  1123. || dz->process == ENV_CREATE
  1124. || dz->process == ENV_BRKTOENV
  1125. || dz->process == ENV_DBBRKTOENV
  1126. || dz->process == FORMANTS
  1127. || dz->process == FMNTSEE
  1128. || dz->process == FORMSEE
  1129. || dz->process == P_SEE
  1130. || dz->process == P_HEAR
  1131. || dz->process == PVOC_ANAL
  1132. || dz->process == PVOC_SYNTH
  1133. || dz->process == P_SYNTH
  1134. || dz->process == P_VOWELS
  1135. || dz->process == ANALENV
  1136. || dz->process == LEVEL
  1137. || (dz->process == HF_PERM1 && (dz->mode == HFP_SNDOUT || dz->mode == HFP_SNDSOUT))
  1138. || (dz->process == HF_PERM2 && (dz->mode == HFP_SNDOUT || dz->mode == HFP_SNDSOUT))
  1139. || dz->process == DEL_PERM
  1140. || dz->process == P_GEN
  1141. || dz->process == CLICK
  1142. || dz->process == MIXINBETWEEN
  1143. || dz->process == CYCINBETWEEN
  1144. || dz->process == SCALED_PAN
  1145. || (dz->process == HOUSE_EXTRACT && dz->mode == HOUSE_CUTGATE)
  1146. || dz->process == HOUSE_GATE
  1147. || dz->process == HOUSE_SORT
  1148. //NEW DEC 2010
  1149. || dz->process == TIME_GRID
  1150. /* and those cases where there really is no outfile */
  1151. || (( dz->process == ENV_WARPING
  1152. || dz->process == ENV_REPLOTTING
  1153. || dz->process == ENV_RESHAPING) && dz->mode == ENV_PEAKCNT)
  1154. || (dz->process == MOD_LOUDNESS && dz->mode == LOUDNESS_LOUDEST)
  1155. || (dz->process == MOD_PITCH && (dz->mode == MOD_TRANSPOS_SEMIT_INFO || dz->mode == MOD_TRANSPOS_INFO))
  1156. || (dz->process == TSTRETCH && dz->mode == TSTR_LENGTH)
  1157. || dz->process == GRAIN_ASSESS
  1158. || dz->process == GRAIN_COUNT
  1159. || dz->process == DISTORT_CYCLECNT
  1160. || dz->process == FIND_PANPOS
  1161. || dz->process == INFO_PROPS
  1162. || dz->process == INFO_SFLEN
  1163. || (dz->process == INFO_TIMELIST && !sloom)
  1164. || dz->process == INFO_TIMESUM
  1165. || dz->process == INFO_TIMEDIFF
  1166. || dz->process == INFO_SAMPTOTIME
  1167. || dz->process == INFO_TIMETOSAMP
  1168. || dz->process == INFO_MAXSAMP
  1169. || dz->process == INFO_MAXSAMP2
  1170. || dz->process == INFO_LOUDCHAN
  1171. || dz->process == INFO_FINDHOLE
  1172. || dz->process == INFO_DIFF
  1173. || dz->process == INFO_CDIFF
  1174. || dz->process == INFO_MUSUNITS
  1175. || dz->process == WINDOWCNT
  1176. || dz->process == CHANNEL
  1177. || dz->process == FREQUENCY
  1178. || dz->process == P_INFO
  1179. || dz->process == P_ZEROS
  1180. || dz->process == ZCROSS_RATIO
  1181. || dz->process == MAKE_VFILT
  1182. || dz->process == RANDCHUNKS
  1183. || dz->process == RANDCUTS
  1184. || dz->process == ENVSYN
  1185. )) {
  1186. if((exit_status = create_sized_outfile(filename,dz))<0)
  1187. return(exit_status);
  1188. }
  1189. /* if an outfile name has been read, copy it to dz->outfilename and advance along the cmdline */
  1190. if(filename != NULL) {
  1191. /*RWD.7.98 - mainly for SYNTH */
  1192. //TW also for MIX programs ETC so may as well do it universally
  1193. strcpy(dz->outfilename,filename);
  1194. (*cmdline)++;
  1195. (*cmdlinecnt)--;
  1196. }
  1197. return(FINISHED);
  1198. }
  1199. /****************************** PRINT_MESSAGES_AND_CLOSE_SNDFILES ******************************/
  1200. int print_messages_and_close_sndfiles(int exit_status,int is_launched,dataptr dz)
  1201. {
  1202. int n; /* OUTPUT ERROR MESSAGES */
  1203. switch(exit_status) {
  1204. case(FINISHED): break;
  1205. case(PROGRAM_ERROR):
  1206. fprintf(stdout,"ERROR: INTERNAL ERROR: (Bug?)\n");
  1207. splice_multiline_string(errstr,"ERROR:");
  1208. break;
  1209. case(SYSTEM_ERROR):
  1210. fprintf(stdout,"ERROR: SYSTEM ERROR\n");
  1211. splice_multiline_string(errstr,"ERROR:");
  1212. break;
  1213. case(MEMORY_ERROR):
  1214. fprintf(stdout,"ERROR: MEMORY ERROR\n");
  1215. splice_multiline_string(errstr,"ERROR:");
  1216. break;
  1217. case(USER_ERROR):
  1218. if(sloom) {
  1219. fprintf(stdout,"ERROR: DATA OR RANGE ERROR\n");
  1220. splice_multiline_string(errstr,"ERROR:");
  1221. } else {
  1222. fprintf(stdout,"ERROR: INCORRECT USE\n");
  1223. splice_multiline_string(errstr,"ERROR:");
  1224. }
  1225. break;
  1226. case(DATA_ERROR):
  1227. fprintf(stdout,"ERROR: INVALID DATA\n");
  1228. splice_multiline_string(errstr,"ERROR:");
  1229. break;
  1230. case(GOAL_FAILED):
  1231. fprintf(stdout,"ERROR: CANNOT ACHIEVE TASK:\n");
  1232. splice_multiline_string(errstr,"ERROR:");
  1233. break;
  1234. case(USAGE_ONLY):
  1235. if(sloom) {
  1236. fprintf(stdout,"ERROR: PROGRAM ERROR: usage messages should not be called.\n");
  1237. fflush(stdout);
  1238. } else
  1239. fprintf(stdout,"%s",errstr);
  1240. break;
  1241. case(TK_USAGE):
  1242. if(!sloom)
  1243. fprintf(stdout,"ERROR: PROGRAM ERROR: TK usage messages should not be called.\n");
  1244. else
  1245. exit_status = FINISHED;
  1246. break;
  1247. default:
  1248. fprintf(stdout,"ERROR: INTERNAL ERROR: (Bug?)\n");
  1249. fprintf(stdout,"ERROR: Unknown case in print_messages_and_close_sndfiles)\n");
  1250. exit_status = PROGRAM_ERROR;
  1251. break;
  1252. }
  1253. if(dz != NULL) { /* CLOSE (& DELETE) SNDFILES */
  1254. if(dz->ofd >= 0 && (exit_status!=FINISHED || !is_launched) && sndunlink(dz->ofd) < 0)
  1255. fprintf(stdout, "ERROR: Can't set output soundfile for deletion.\n");
  1256. if((dz->ofd >= 0) && dz->needpeaks){
  1257. if(sndputpeaks(dz->ofd,dz->outchans,dz->outpeaks)) {
  1258. fprintf(stdout,"WARNING: failed to write PEAK data\n");
  1259. fflush(stdout);
  1260. }
  1261. }
  1262. // if(dz->ofd >= 0 && sndcloseEx(dz->ofd) < 0) {
  1263. // fprintf(stdout, "WARNING: Can't close output sf-soundfile : %s\n",sferrstr());
  1264. // fflush(stdout);
  1265. // }
  1266. if(dz->ofd >= 0) {
  1267. if(sndcloseEx(dz->ofd) < 0) {
  1268. fprintf(stdout, "WARNING: Can't close output sf-soundfile : %s\n",sferrstr());
  1269. fflush(stdout);
  1270. }
  1271. }
  1272. if(dz->other_file >= 0 && exit_status!=FINISHED && sndunlink(dz->other_file) < 0) {
  1273. fprintf(stdout, "ERROR: Can't set secondary soundfile for deletion.\n");
  1274. fflush(stdout);
  1275. }
  1276. if((dz->other_file >= 0) && dz->needotherpeaks){
  1277. if(sndputpeaks(dz->other_file,dz->otheroutchans,dz->otherpeaks)) {
  1278. fprintf(stdout,"WARNING: failed to write PEAK data\n");
  1279. fflush(stdout);
  1280. }
  1281. }
  1282. if(dz->other_file >= 0 && sndcloseEx(dz->other_file) < 0)
  1283. fprintf(stdout, "WARNING: Can't close secondary soundfile.\n");
  1284. if(dz->ifd != NULL && dz->infilecnt >= 0) {
  1285. for(n=0;n<dz->infilecnt;n++) {
  1286. /* ALL OTHER CASES */
  1287. if(dz->ifd[n] >= 0 && sndcloseEx(dz->ifd[n]) < 0)
  1288. fprintf(stdout, "WARNING: Can't close input sf-soundfile %d.\n",n+1);
  1289. }
  1290. }
  1291. }
  1292. // sffinish();
  1293. if(sloom)
  1294. fprintf(stdout,"END:");
  1295. else
  1296. #ifdef unix
  1297. fprintf(stdout,"\n\n");
  1298. #else
  1299. fprintf(stdout,"\n");
  1300. #endif
  1301. fflush(stdout);
  1302. if(exit_status != FINISHED) {
  1303. return(FAILED);
  1304. }
  1305. return(SUCCEEDED);
  1306. }
  1307. /****************************** DO_EXTRA_FILES *********************************/
  1308. int do_extra_files(dataptr dz)
  1309. {
  1310. char temp[200];
  1311. int endword = dz->all_words - 1;
  1312. strcpy(temp,dz->wordstor[endword]);
  1313. //TW REVISION Dec 2002
  1314. // p = temp + strlen(temp) - 1;
  1315. // sprintf(p,"1");
  1316. insert_new_number_at_filename_end(temp,1,1);
  1317. switch(dz->mode) {
  1318. case(PICH_TO_BIN):
  1319. //TW CORRECTED Dec 2002
  1320. if((dz->other_file = sndcreat_formatted(temp,dz->insams[0]/dz->wanted,SAMP_FLOAT,
  1321. 1,dz->infile->srate,CDP_CREATE_NORMAL)) < 0) {
  1322. sprintf(errstr,"Cannot open output pitch file %s\n",temp);
  1323. return(DATA_ERROR);
  1324. }
  1325. break;
  1326. case(PICH_TO_BRK):
  1327. strip_ext(temp);
  1328. if((dz->fp = fopen(temp,"w"))==NULL) {
  1329. sprintf(errstr,"Cannot open file %s for output.\n",temp);
  1330. return(DATA_ERROR);
  1331. }
  1332. break;
  1333. default:
  1334. sprintf(errstr,"Unknown mode.\n");
  1335. return(DATA_ERROR);
  1336. }
  1337. return(FINISHED);
  1338. }
  1339. /******************************* CREATE_SIZED_OUTFILE **************************/
  1340. int create_sized_outfile(char *filename,dataptr dz)
  1341. {
  1342. int maxsize, minsize;
  1343. int exit_status, n, orig_chans = 1;
  1344. int stype = SAMP_FLOAT;
  1345. switch(dz->process) {
  1346. case(PVOC_ANAL):
  1347. dz->true_outfile_stype = stype;
  1348. dz->outfilesize = -1;
  1349. break;
  1350. case(PVOC_SYNTH): case(PVOC_EXTRACT):
  1351. if(dz->floatsam_output != 1)
  1352. stype = dz->outfile->stype;
  1353. //NOV 2005: proposed RWD fix, changes above line to PVOC
  1354. // stype = dz->outfile->stype;
  1355. dz->true_outfile_stype = stype;
  1356. dz->outfilesize = -1;
  1357. break;
  1358. case(SYNTH_SPEC):
  1359. dz->outfilesize = -1;
  1360. break;
  1361. default:
  1362. switch(dz->process_type) {
  1363. case(EQUAL_SNDFILE):
  1364. /*RWD May 2005 */
  1365. #ifdef NOTDEF
  1366. if(dz->floatsam_output != 1)
  1367. stype = SAMP_SHORT;
  1368. else
  1369. stype = dz->infile->stype;
  1370. dz->true_outfile_stype = stype;
  1371. #else
  1372. if(dz->infile->stype < 0) /* if no infile, default to shorts */
  1373. dz->infile->stype = SAMP_SHORT;
  1374. if(dz->floatsam_output != 1)
  1375. stype = dz->infile->stype; /* keep infile stype for outfile */
  1376. else
  1377. stype = SAMP_FLOAT; /* or force floats */
  1378. dz->true_outfile_stype = stype;
  1379. #endif
  1380. dz->outfilesize = dz->insams[0]; /* RWD watch this... */
  1381. break;
  1382. case(EQUAL_ENVFILE):
  1383. case(EQUAL_ANALFILE): case(PITCH_TO_PITCH):
  1384. stype = dz->infile->stype;
  1385. dz->true_outfile_stype = stype;
  1386. dz->outfilesize = dz->insams[0]; /* RWD watch this... */
  1387. break;
  1388. case(CREATE_ENVFILE):
  1389. dz->infile->channels = 1;
  1390. /* fallthro */
  1391. case(EXTRACT_ENVFILE): case(UNEQUAL_ENVFILE):
  1392. case(BIG_ANALFILE): case(PITCH_TO_BIGPITCH):
  1393. dz->true_outfile_stype = stype;
  1394. dz->outfilesize = -1;
  1395. break;
  1396. case(ANAL_TO_FORMANTS):
  1397. case(EQUAL_FORMANTS):
  1398. dz->true_outfile_stype = stype;
  1399. /*
  1400. DO FORMANT FILES HAVE TO HAVE ONE CHANNEL ????? YES
  1401. */
  1402. dz->outfilesize = -1;
  1403. // COMMENT dz->infile->channels (MUST BE/IS) set to correct outval, then reset, external to this call
  1404. break;
  1405. case(PITCH_TO_ANAL):
  1406. dz->true_outfile_stype = stype;
  1407. dz->outfilesize = -1;
  1408. // This reset of infile->channels is for the benefit of MAKE & MAKE2: reset is below
  1409. orig_chans = dz->infile->channels;
  1410. dz->infile->channels = dz->infile->origchans;
  1411. break;
  1412. case(UNEQUAL_SNDFILE):
  1413. /*RWD May 2005 this code back to front! */
  1414. #ifdef NOTDEF
  1415. if(dz->floatsam_output!=1)
  1416. stype = SAMP_SHORT;
  1417. else
  1418. stype = dz->infile->stype;
  1419. dz->true_outfile_stype = stype;
  1420. dz->outfilesize = -1;
  1421. #else
  1422. if(dz->infile->stype < 0) /* if no infile, default to shorts */
  1423. dz->infile->stype = SAMP_SHORT;
  1424. if(dz->floatsam_output!=1)
  1425. stype = dz->infile->stype; /* outfile has infile sample type */
  1426. else
  1427. stype = SAMP_FLOAT;
  1428. dz->true_outfile_stype = stype; /* or floats if asked for */
  1429. dz->outfilesize = -1;
  1430. #endif
  1431. break;
  1432. case(PSEUDOSNDFILE):
  1433. dz->true_outfile_stype = SAMP_SHORT;
  1434. dz->outfilesize = -1;
  1435. // COMMENT dz->infile->channels (MUST BE/IS) set to correct outval, then reset, external to this call
  1436. break;
  1437. case(MAX_ANALFILE):
  1438. maxsize = dz->insams[0];
  1439. for(n=1;n<dz->infilecnt;n++)
  1440. maxsize = max(maxsize,dz->insams[n]);
  1441. dz->outfilesize = maxsize;
  1442. break;
  1443. case(MIN_ANALFILE):
  1444. minsize = dz->insams[0];
  1445. for(n=1;n<dz->infilecnt;n++)
  1446. minsize = min(minsize,dz->insams[n]);
  1447. dz->outfilesize = minsize;
  1448. break;
  1449. case(PITCH_TO_PSEUDOSND):
  1450. dz->outfilesize = dz->wlength; /* RWD watch this... */
  1451. // COMMENT dz->infile->channels (MUST BE/IS) set to correct outval, then reset, external to this call
  1452. break;
  1453. case(TO_TEXTFILE):
  1454. if(file_has_reserved_extension(filename)) {
  1455. sprintf(errstr,"Cannot open a textfile (%s) with a reserved extension.\n",filename);
  1456. return(USER_ERROR);
  1457. }
  1458. if((dz->fp = fopen(filename,"w"))==NULL) {
  1459. sprintf(errstr,"Cannot open output file %s\n",filename);
  1460. return(USER_ERROR);
  1461. }
  1462. return FINISHED;
  1463. default:
  1464. sprintf(errstr,"Invalid process_type %d: create_sized_outfile()\n",dz->process_type);
  1465. return(PROGRAM_ERROR);
  1466. }
  1467. break;
  1468. }
  1469. /* RWD April 2005 write WAVE_EX if possible! */
  1470. /*TODO: read channel format from input, somewhere into dz*/
  1471. if(dz->outfiletype== SNDFILE_OUT && (dz->infile->channels > 2 || stype > SAMP_FLOAT)){
  1472. SFPROPS props, inprops;
  1473. dz2props(dz,&props);
  1474. props.chans = dz->infile->channels;
  1475. props.srate = dz->infile->srate;
  1476. if(dz->ifd && dz->ifd[0] >=0) {
  1477. if(snd_headread(dz->ifd[0], &inprops)) /* snd_getchanformat not working ...*/
  1478. props.chformat = inprops.chformat;
  1479. }
  1480. #ifdef _DEBUG
  1481. printf("DEBUG: writing WAVE_EX outfile\n");
  1482. #endif
  1483. dz->ofd = sndcreat_ex(filename,dz->outfilesize,&props,SFILE_CDP,CDP_CREATE_NORMAL);
  1484. if(dz->ofd < 0){
  1485. sprintf(errstr,"Cannot open output file %s\n", filename);
  1486. return(DATA_ERROR);
  1487. }
  1488. }
  1489. else{
  1490. if((dz->ofd = sndcreat_formatted(filename,dz->outfilesize,stype,
  1491. dz->infile->channels,dz->infile->srate,CDP_CREATE_NORMAL)) < 0) {
  1492. sprintf(errstr,"Cannot open output file %s\n", filename);
  1493. return(DATA_ERROR);
  1494. }
  1495. }
  1496. dz->outchans = dz->infile->channels;
  1497. if((exit_status = establish_peak_status(dz))<0)
  1498. return(exit_status);
  1499. switch(dz->process_type) {
  1500. case(PITCH_TO_ANAL): /* RESET, See above */
  1501. dz->infile->channels = orig_chans;
  1502. break;
  1503. }
  1504. switch(dz->process) {
  1505. case(PVOC_ANAL): case(PVOC_SYNTH): case(PVOC_EXTRACT):
  1506. dz->outfilesize = sndsizeEx(dz->ofd);
  1507. dz->total_samps_written = 0;
  1508. break;
  1509. default:
  1510. switch(dz->process_type) {
  1511. case(UNEQUAL_SNDFILE): case(UNEQUAL_ENVFILE): case(CREATE_ENVFILE):
  1512. case(EXTRACT_ENVFILE): case(BIG_ANALFILE): case(ANAL_TO_FORMANTS):
  1513. case(PITCH_TO_ANAL): case(PITCH_TO_BIGPITCH): case(PSEUDOSNDFILE):
  1514. case(PITCH_TO_PSEUDOSND):
  1515. // TW THIS doesn't achieve anythuing, I think.
  1516. dz->outfilesize = sndsizeEx(dz->ofd);
  1517. break;
  1518. }
  1519. break;
  1520. }
  1521. if(dz->process_type != TO_TEXTFILE) {
  1522. if((exit_status = assign_wavetype(dz)) < 0)
  1523. return exit_status;
  1524. }
  1525. return(FINISHED);
  1526. }
  1527. /* RWD.7.98 sfsys98 version, for SYNTH */
  1528. //TW REDUNDANT ??
  1529. //int create_sized_outfile_formatted(const char *filename,int srate,int channels, int stype,dataptr dz)
  1530. //{
  1531. // if((dz->ofd = sndcreat_formatted(filename,-1,stype,
  1532. // channels,srate,CDP_CREATE_NORMAL)) < 0) {
  1533. // sprintf(errstr,"Cannot open output file %s: %s\n", filename,rsferrstr);
  1534. // return SYSTEM_ERROR;
  1535. // }
  1536. // //RWD.10.98
  1537. // dz->true_outfile_stype = stype;
  1538. // dz->total_samps_written = 0L;
  1539. // return FINISHED;
  1540. //}
  1541. //TW CREATE TEMPFILE NAME (for bad sndseek cases: and other spcial cases)
  1542. void get_other_filename(char *filename,char c)
  1543. {
  1544. char *p, *end;
  1545. p = filename + strlen(filename);
  1546. end = p;
  1547. while(p > filename) {
  1548. p--;
  1549. if(*p == '.')
  1550. break; /* return start of final name extension */
  1551. else if(*p == '/' || *p == '\\') {
  1552. p = end; /* directory path component found before finding filename extension */
  1553. break; /* go to end of name */
  1554. }
  1555. }
  1556. if(p == filename)
  1557. p = end; /* no finalname extension found, go to end of name */
  1558. p--; /* insert '1' at name end */
  1559. *p = c;
  1560. return;
  1561. }
  1562. void insert_new_number_at_filename_end(char *filename,int num,int overwrite_last_char)
  1563. /* FUNCTIONS ASSUMES ENOUGH SPACE IS ALLOCATED !! */
  1564. {
  1565. char *p;
  1566. char ext[64];
  1567. p = filename + strlen(filename) - 1;
  1568. while(p > filename) {
  1569. if(*p == '/' || *p == '\\' || *p == ':') {
  1570. p = filename;
  1571. break;
  1572. }
  1573. if(*p == '.') {
  1574. strcpy(ext,p);
  1575. if(overwrite_last_char)
  1576. p--;
  1577. sprintf(p,"%d",num);
  1578. strcat(filename,ext);
  1579. return;
  1580. }
  1581. p--;
  1582. }
  1583. if(p == filename) {
  1584. p += strlen(filename);
  1585. if(overwrite_last_char)
  1586. p--;
  1587. sprintf(p,"%d",num);
  1588. }
  1589. }
  1590. void insert_new_chars_at_filename_end(char *filename,char *str)
  1591. /* FUNCTIONS ASSUMES ENOUGH SPACE IS ALLOCATED !! */
  1592. {
  1593. char *p;
  1594. char ext[64];
  1595. p = filename + strlen(filename) - 1;
  1596. while(p > filename) {
  1597. if(*p == '/' || *p == '\\' || *p == ':') {
  1598. p = filename;
  1599. break;
  1600. }
  1601. if(*p == '.') {
  1602. strcpy(ext,p);
  1603. *p = ENDOFSTR;
  1604. strcat(filename,str);
  1605. strcat(filename,ext);
  1606. return;
  1607. }
  1608. p--;
  1609. }
  1610. if(p == filename)
  1611. strcat(filename,str);
  1612. }
  1613. void replace_filename_extension(char *filename,char *ext)
  1614. /* FUNCTIONS ASSUMES ENOUGH SPACE IS ALLOCATED !! */
  1615. {
  1616. char *p;
  1617. p = filename + strlen(filename) - 1;
  1618. while(p > filename) {
  1619. if(*p == '/' || *p == '\\' || *p == ':') {
  1620. p = filename;
  1621. break;
  1622. }
  1623. if(*p == '.') {
  1624. *p = ENDOFSTR;
  1625. strcat(filename,ext);
  1626. return;
  1627. }
  1628. p--;
  1629. }
  1630. if(p == filename)
  1631. strcat(filename,ext);
  1632. }
  1633. void delete_filename_lastchar(char *filename)
  1634. {
  1635. char *p, *q = filename + strlen(filename);
  1636. p = q - 1;
  1637. while(p > filename) {
  1638. if(*p == '/' || *p == '\\' || *p == ':') {
  1639. p = filename;
  1640. break;
  1641. }
  1642. if(*p == '.') {
  1643. while(p <= q) {
  1644. *(p - 1) = *p;
  1645. p++;
  1646. }
  1647. return;
  1648. }
  1649. p--;
  1650. }
  1651. if(p == filename) {
  1652. p = q - 1;
  1653. *p = ENDOFSTR;
  1654. }
  1655. }
  1656. int reset_peak_finder(dataptr dz)
  1657. {
  1658. int j;
  1659. if(dz->needpeaks && (dz->ofd >= 0)){
  1660. if(sndputpeaks(dz->ofd,dz->outchans,dz->outpeaks)) {
  1661. fprintf(stdout,"WARNING: failed to write PEAK data\n");
  1662. fflush(stdout);
  1663. }
  1664. }
  1665. if(dz->outpeaks==NULL) {
  1666. dz->outpeaks = (CHPEAK *) malloc(sizeof(CHPEAK) * dz->outchans);
  1667. if(dz->outpeaks==NULL)
  1668. return MEMORY_ERROR;
  1669. dz->outpeakpos = (unsigned int *) malloc(sizeof(unsigned int) * dz->outchans);
  1670. if(dz->outpeakpos==NULL)
  1671. return MEMORY_ERROR;
  1672. }
  1673. //JAN 2007 moved
  1674. for(j = 0;j<dz->outchans;j++)
  1675. dz->outpeakpos[j] = 0;
  1676. for(j = 0;j<dz->outchans;j++) {
  1677. dz->outpeaks[j].value = 0.0;
  1678. dz->outpeaks[j].position = 0;
  1679. }
  1680. dz->needpeaks = 1;
  1681. return FINISHED;
  1682. }
  1683. int establish_peak_status(dataptr dz)
  1684. {
  1685. int i;
  1686. if(dz->outpeaks!=NULL)
  1687. return FINISHED;
  1688. if(dz->process < FOOT_OF_GROUCHO_PROCESSES) {
  1689. switch(dz->process) {
  1690. //sound or pseudosnd output
  1691. case(FMNTSEE): case(FORMSEE): case(PVOC_SYNTH):
  1692. case(LEVEL): case(P_SEE):
  1693. // 2010
  1694. case(MTON): case(FLUTTER):
  1695. case(SETHARES): case(MCHSHRED):
  1696. case(MCHZIG): case(MCHSTEREO):
  1697. break;
  1698. default:
  1699. //spectral output
  1700. dz->needpeaks = 0;
  1701. return FINISHED;
  1702. }
  1703. }
  1704. //spectral output
  1705. switch(dz->process) {
  1706. case(P_SYNTH): case(P_INSERT): case(P_PTOSIL): case(P_NTOSIL): case(P_SINSERT):
  1707. case(P_GEN): case(P_INTERP): case(MAKE2): case(ANALENV): case(FREEZE2):
  1708. case(PVOC_ANAL): case(MAKE): case(ENVSYN):
  1709. // 2010
  1710. case(ANALJOIN): case(ONEFORM_GET): case(ONEFORM_PUT): case(ONEFORM_COMBINE):
  1711. case(SPEC_REMOVE): case(SPECROSS): case(SPECLEAN): case(SPECTRACT):
  1712. case(BRKTOPI): case(SPECSLICE):
  1713. case(TUNEVARY): /* RWD Nov 21, may need to add other progs here... */
  1714. /* RWD 2023 here we go...*/
  1715. case(SPECANAL): case(FRACSPEC): case(FTURANAL): case(SPECRAND): case(SPECSQZ):
  1716. case(SPECMORPH): case(SPECULATE): case(SPECTUNE): case(SPECFOLD): case(CALTRAIN):
  1717. dz->needpeaks = 0;
  1718. return FINISHED;
  1719. //processes which generate text data.
  1720. // 2010
  1721. switch(dz->process) {
  1722. case(PTOBRK):
  1723. case(RMRESP):
  1724. case(MULTIMIX):
  1725. dz->needpeaks = 0;
  1726. return FINISHED;
  1727. }
  1728. //processes which write to intermediate temporary files: needpeaks set to 1 later.
  1729. case(SYNTH_SPEC): case(MIXTWO): case(SHUDDER):
  1730. dz->needpeaks = 0;
  1731. return FINISHED;
  1732. //processes which are normalised via an intermediate temporary files: needpeaks set to 1 later.
  1733. case(MOD_RADICAL):
  1734. if(dz->mode == MOD_LOBIT || dz->mode == MOD_LOBIT2) {
  1735. dz->needpeaks = 0;
  1736. return FINISHED;
  1737. }
  1738. break;
  1739. //processes with several outputs, where peak is reset to zero before each file is written-to
  1740. case(HOUSE_GATE):
  1741. case(TIME_GRID):
  1742. dz->needpeaks = 0;
  1743. return FINISHED;
  1744. case(TWIXT):
  1745. if(dz->mode == TRUE_EDIT) {
  1746. dz->needpeaks = 0;
  1747. return FINISHED;
  1748. }
  1749. break;
  1750. //processes needing no maxsamp data
  1751. case(HOUSE_DUMP):
  1752. dz->needpeaks = 0;
  1753. return FINISHED;
  1754. }
  1755. dz->needpeaks = 1;
  1756. dz->outpeaks = (CHPEAK *) malloc(sizeof(CHPEAK) * dz->outchans);
  1757. if(dz->outpeaks==NULL)
  1758. return MEMORY_ERROR;
  1759. dz->outpeakpos = (unsigned int *) malloc(sizeof(unsigned int) * dz->outchans);
  1760. if(dz->outpeakpos==NULL)
  1761. return MEMORY_ERROR;
  1762. for(i=0;i < dz->outchans;i++){
  1763. dz->outpeaks[i].value = 0.0f;
  1764. dz->outpeaks[i].position = 0;
  1765. dz->outpeakpos[i] = 0;
  1766. }
  1767. return FINISHED;
  1768. }
  1769. void strip_ext(char *temp)
  1770. {
  1771. char *p = temp + strlen(temp) - 1;
  1772. while(p > temp) {
  1773. if(*p == '.') {
  1774. *p = ENDOFSTR;
  1775. return;
  1776. }
  1777. p--;
  1778. }
  1779. }
  1780. int assign_wavetype(dataptr dz)
  1781. {
  1782. //wavetype wtype;
  1783. int isenv = 1;
  1784. int dummy = 1;
  1785. switch(dz->process) {
  1786. case(PVOC_ANAL):
  1787. //wtype = wt_analysis;
  1788. break;
  1789. case(PVOC_SYNTH): case(PVOC_EXTRACT): case(SYNTH_SPEC):
  1790. //wtype = wt_wave;
  1791. break;
  1792. case(REPITCH):
  1793. //if(dz->mode == PTP)
  1794. // wtype = wt_transposition;
  1795. //else
  1796. // wtype = wt_pitch;
  1797. break;
  1798. default:
  1799. switch(dz->process_type) {
  1800. case(EQUAL_SNDFILE):
  1801. case(UNEQUAL_SNDFILE):
  1802. case(PSEUDOSNDFILE):
  1803. case(PITCH_TO_PSEUDOSND):
  1804. // wtype = wt_wave;
  1805. break;
  1806. case(EQUAL_ENVFILE):
  1807. case(CREATE_ENVFILE):
  1808. case(EXTRACT_ENVFILE):
  1809. case(UNEQUAL_ENVFILE):
  1810. if(sndputprop(dz->ofd,"is an envelope",(char *) &isenv,sizeof(int)) < 0){
  1811. sprintf(errstr,"Failure to write envelope property. assign_wavetype()\n");
  1812. return(PROGRAM_ERROR);
  1813. }
  1814. // wtype = wt_binenv;
  1815. break;
  1816. case(EQUAL_ANALFILE):
  1817. case(BIG_ANALFILE):
  1818. case(MAX_ANALFILE):
  1819. case(MIN_ANALFILE):
  1820. case(PITCH_TO_ANAL):
  1821. // wtype = wt_analysis;
  1822. break;
  1823. case(PITCH_TO_PITCH):
  1824. case(PITCH_TO_BIGPITCH):
  1825. if((dz->process == REPITCH && dz->mode != PTP) || dz->is_transpos) {
  1826. if(sndputprop(dz->ofd,"is a transpos file", (char *)&dummy, sizeof(int)) < 0) {
  1827. sprintf(errstr,"Failure to write transposition property. assign_wavetype()\n");
  1828. return(PROGRAM_ERROR);
  1829. }
  1830. // wtype = wt_transposition;
  1831. } else if((dz->process == P_APPROX || dz->process == P_INVERT || dz->process == P_QUANTISE ||
  1832. dz->process == P_RANDOMISE || dz->process == P_SMOOTH || dz->process == P_VIBRATO)
  1833. && (dz->mode == 1)) {
  1834. if(sndputprop(dz->ofd,"is a transpos file", (char *)&dummy, sizeof(int)) < 0) {
  1835. sprintf(errstr,"Failure to write transposition property. assign_wavetype()\n");
  1836. return(PROGRAM_ERROR);
  1837. }
  1838. } else if((dz->process == P_EXAG) && (dz->mode == 1 || dz->mode == 3 || dz->mode == 5)) {
  1839. if(sndputprop(dz->ofd,"is a transpos file", (char *)&dummy, sizeof(int)) < 0) {
  1840. sprintf(errstr,"Failure to write transposition property. assign_wavetype()\n");
  1841. return(PROGRAM_ERROR);
  1842. }
  1843. } else {
  1844. if(sndputprop(dz->ofd,"is a pitch file", (char *)&dummy, sizeof(int)) < 0) {
  1845. sprintf(errstr,"Failure to write pitch property. assign_wavetype()\n");
  1846. return(PROGRAM_ERROR);
  1847. }
  1848. // wtype = wt_pitch;
  1849. }
  1850. break;
  1851. case(ANAL_TO_FORMANTS):
  1852. case(EQUAL_FORMANTS):
  1853. if(sndputprop(dz->ofd,"is a formant file", (char *)&dummy, sizeof(int)) < 0) {
  1854. sprintf(errstr,"Failure to write formant property. assign_wavetype(): %s\n",sferrstr());
  1855. return(PROGRAM_ERROR);
  1856. }
  1857. // wtype = wt_formant;
  1858. break;
  1859. default:
  1860. sprintf(errstr,"Unknown process_type while assigning output wavetype.\n");
  1861. return PROGRAM_ERROR;
  1862. }
  1863. }
  1864. // if(sndputprop(dz->ofd,"type",(char *)&wtype,sizeof(wavetype)) < 0){
  1865. // sprintf(errstr,"Failure to write wavetype factor. assign_wavetype()\n");
  1866. // return(PROGRAM_ERROR);
  1867. // }
  1868. return FINISHED;
  1869. }
  1870. //TW MODIFY INPUT OUTFILENAME, to deal with intermediate temp files, in comdline case.
  1871. //char *get_other_filename_x(char *filename,char c)
  1872. //{
  1873. // char *p, *nufilename;
  1874. // int len = strlen(filename);
  1875. // char temp[] = "_cdptemp";
  1876. // len += 9;
  1877. // if(((char *)nufilename = (char *)malloc(len)) == NULL)
  1878. // return NULL;
  1879. // strcpy(nufilename,filename);
  1880. // strcat(nufilename,temp);
  1881. // p = nufilename + len;
  1882. // *p = ENDOFSTR;
  1883. // p--;
  1884. // *p = c;
  1885. // return nufilename;
  1886. //}
  1887. char *get_other_filename_x(char *filename,char c)
  1888. {
  1889. char *p, *nufilename, ext[24];
  1890. int len = strlen(filename);
  1891. char temp[] = "_cdptemp";
  1892. len += 12;
  1893. if((nufilename = (char *)malloc(len)) == NULL)
  1894. return NULL;
  1895. strcpy(nufilename,filename);
  1896. ext[0] = c;
  1897. ext[1] = ENDOFSTR;
  1898. p = nufilename;
  1899. while(*p != ENDOFSTR) {
  1900. if(*p == '.') {
  1901. strcat(ext,p);
  1902. *p = ENDOFSTR;
  1903. break;
  1904. }
  1905. p++;
  1906. }
  1907. strcat(nufilename,temp);
  1908. strcat(nufilename,ext);
  1909. return nufilename;
  1910. }
  1911. // FEB 2010 TW
  1912. void insert_separator_on_sndfile_name(char *filename,int cnt)
  1913. /* FUNCTIONS ASSUMES ENOUGH SPACE IS ALLOCATED !! */
  1914. {
  1915. int n;
  1916. char ext[8];
  1917. char *p = filename, *z = filename; // z will be place to insert separator
  1918. p += strlen(filename);
  1919. p -= 4; // p set to start of any 4char extension [p]..a1 OR a1[p].wav OR a1.[p]aiff OR [p]aaa1 OR aaa[p]aaa1 OR aaaaaa1[p].wav OR aaaaaa1.[p]aiff
  1920. // if p <= start of name ...
  1921. // insert separator at end [p]..a1 --> a1_
  1922. if(p > filename) {
  1923. // if p is at start of 4 letter extension ...
  1924. // insert separator at [p] a1[p].wav --> a1_.wav aaaaaa1[p].wav --> aaaaaa1_.wav
  1925. if(!strcmp(p,".wav") || !strcmp(p,".aif")) {
  1926. strcpy(ext,p);
  1927. z = p;
  1928. } else {
  1929. p--;// p set to start of any 5char extension aa[p]aaaa1 OR aaaaaa1[p].aiff
  1930. // if p less than start of name ...
  1931. // insert separator at end [p]..aaa1 --> aaa1_
  1932. if(p > filename) {
  1933. // if p is at start of 5 letter extension ...
  1934. // insert separator at [p] a1[p].aiff --> a1_.aiff aaaaaa1[p].aiff --> aaaaaa1_.aiff
  1935. if(!strcmp(p,".aiff")) {
  1936. strcpy(ext,p);
  1937. z = p;
  1938. // else, no extension match
  1939. // insert separator at end of name aa[p]aaaa1 --> aaaaaa1_
  1940. }
  1941. }
  1942. }
  1943. }
  1944. if(z == filename) {
  1945. for(n=0;n<cnt;n++)
  1946. strcat(filename,"_");
  1947. } else {
  1948. for(n=0;n<cnt;n++)
  1949. *z++ = '_';
  1950. *z = ENDOFSTR;
  1951. }
  1952. }