hover2.c 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <structures.h>
  4. #include <tkglobals.h>
  5. #include <pnames.h>
  6. #include <filetype.h>
  7. #include <processno.h>
  8. #include <modeno.h>
  9. #include <logic.h>
  10. #include <globcon.h>
  11. #include <cdpmain.h>
  12. #include <math.h>
  13. #include <mixxcon.h>
  14. #include <osbind.h>
  15. #include <standalone.h>
  16. #include <ctype.h>
  17. #include <sfsys.h>
  18. #include <string.h>
  19. #include <srates.h>
  20. #ifdef unix
  21. #define round(x) lround((x))
  22. #endif
  23. char errstr[2400];
  24. int anal_infiles = 1;
  25. int sloom = 0;
  26. int sloombatch = 0;
  27. const char* cdp_version = "6.1.0";
  28. //CDP LIB REPLACEMENTS
  29. static int check_hover_param_validity_and_consistency(int *maxtraverse,dataptr dz);
  30. static int setup_hover_application(dataptr dz);
  31. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  32. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  33. static int setup_hover_param_ranges_and_defaults(dataptr dz);
  34. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  35. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  36. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  37. static int establish_application(dataptr dz);
  38. static int initialise_vflags(dataptr dz);
  39. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  40. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  41. static int mark_parameter_types(dataptr dz,aplptr ap);
  42. static int assign_file_data_storage(int infilecnt,dataptr dz);
  43. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  44. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  45. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  46. static int hover2(dataptr dz);
  47. static int create_hover2_sndbufs(int maxtraverse,dataptr dz);
  48. static int stepread_value_from_brktable(double thistime,int paramno,dataptr dz);
  49. #define HOVER_FRQ 0
  50. #define HOVER_LOC 1
  51. #define HOVER_FRQR 2
  52. #define HOVER_LOCR 3
  53. #define HOVER_DUR2 4
  54. #define TRAVERSE 0
  55. #define HOVER_SPLIC .015
  56. /**************************************** MAIN *********************************************/
  57. int main(int argc,char *argv[])
  58. {
  59. int exit_status;
  60. dataptr dz = NULL;
  61. char **cmdline;
  62. int cmdlinecnt;
  63. int n, maxtraverse = 0;
  64. aplptr ap;
  65. int is_launched = FALSE;
  66. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  67. fprintf(stdout,"%s\n",cdp_version);
  68. fflush(stdout);
  69. return 0;
  70. }
  71. /* CHECK FOR SOUNDLOOM */
  72. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  73. sloom = 0;
  74. sloombatch = 1;
  75. }
  76. if(sflinit("cdp")){
  77. sfperror("cdp: initialisation\n");
  78. return(FAILED);
  79. }
  80. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  81. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  82. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  83. return(FAILED);
  84. }
  85. if(!sloom) {
  86. if(argc == 1) {
  87. usage1();
  88. return(FAILED);
  89. } else if(argc == 2) {
  90. usage2(argv[1]);
  91. return(FAILED);
  92. }
  93. }
  94. if(!sloom) {
  95. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  96. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  97. return(FAILED);
  98. }
  99. cmdline = argv;
  100. cmdlinecnt = argc;
  101. if((get_the_process_no(argv[0],dz))<0)
  102. return(FAILED);
  103. cmdline++;
  104. cmdlinecnt--;
  105. // setup_particular_application =
  106. if((exit_status = setup_hover_application(dz))<0) {
  107. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  108. return(FAILED);
  109. }
  110. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  111. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  112. return(FAILED);
  113. }
  114. } else {
  115. //parse_TK_data() =
  116. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  117. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  118. return(exit_status);
  119. }
  120. }
  121. ap = dz->application;
  122. // parse_infile_and_hone_type() =
  123. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  124. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  125. return(FAILED);
  126. }
  127. // setup_param_ranges_and_defaults() =
  128. if((exit_status = setup_hover_param_ranges_and_defaults(dz))<0) {
  129. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  130. return(FAILED);
  131. }
  132. // open_first_infile CDP LIB
  133. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  134. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  135. return(FAILED);
  136. }
  137. cmdlinecnt--;
  138. cmdline++;
  139. // handle_extra_infiles() : redundant
  140. // handle_outfile() =
  141. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  142. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  143. return(FAILED);
  144. }
  145. // handle_formants() redundant
  146. // handle_formant_quiksearch() redundant
  147. // handle_special_data() redundant
  148. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  149. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  150. return(FAILED);
  151. }
  152. // check_param_validity_and_consistency....
  153. if((exit_status = check_hover_param_validity_and_consistency(&maxtraverse,dz))<0) {
  154. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  155. return(FAILED);
  156. }
  157. is_launched = TRUE;
  158. dz->bufcnt = 3;
  159. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  160. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  161. return(MEMORY_ERROR);
  162. }
  163. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  164. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  165. return(MEMORY_ERROR);
  166. }
  167. for(n = 0;n <dz->bufcnt; n++)
  168. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  169. dz->sampbuf[n] = (float *)0;
  170. if((exit_status = create_hover2_sndbufs(maxtraverse,dz))<0) {
  171. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  172. return(FAILED);
  173. }
  174. //param_preprocess() redundant
  175. //spec_process_file =
  176. if((exit_status = hover2(dz))<0) {
  177. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  178. return(FAILED);
  179. }
  180. if((exit_status = complete_output(dz))<0) { // CDP LIB
  181. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  182. return(FAILED);
  183. }
  184. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  185. free(dz);
  186. return(SUCCEEDED);
  187. }
  188. /**********************************************
  189. REPLACED CDP LIB FUNCTIONS
  190. **********************************************/
  191. /****************************** SET_PARAM_DATA *********************************/
  192. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  193. {
  194. ap->special_data = (char)special_data;
  195. ap->param_cnt = (char)paramcnt;
  196. ap->max_param_cnt = (char)maxparamcnt;
  197. if(ap->max_param_cnt>0) {
  198. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  199. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  200. return(MEMORY_ERROR);
  201. }
  202. strcpy(ap->param_list,paramlist);
  203. }
  204. return(FINISHED);
  205. }
  206. /****************************** SET_VFLGS *********************************/
  207. int set_vflgs
  208. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  209. {
  210. ap->option_cnt = (char) optcnt; /*RWD added cast */
  211. if(optcnt) {
  212. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  213. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  214. return(MEMORY_ERROR);
  215. }
  216. strcpy(ap->option_list,optlist);
  217. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  218. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  219. return(MEMORY_ERROR);
  220. }
  221. strcpy(ap->option_flags,optflags);
  222. }
  223. ap->vflag_cnt = (char) vflagcnt;
  224. ap->variant_param_cnt = (char) vparamcnt;
  225. if(vflagcnt) {
  226. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  227. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  228. return(MEMORY_ERROR);
  229. }
  230. strcpy(ap->variant_list,varlist);
  231. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  232. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  233. return(MEMORY_ERROR);
  234. }
  235. strcpy(ap->variant_flags,varflags);
  236. }
  237. return(FINISHED);
  238. }
  239. /***************************** APPLICATION_INIT **************************/
  240. int application_init(dataptr dz)
  241. {
  242. int exit_status;
  243. int storage_cnt;
  244. int tipc, brkcnt;
  245. aplptr ap = dz->application;
  246. if(ap->vflag_cnt>0)
  247. initialise_vflags(dz);
  248. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  249. ap->total_input_param_cnt = (char)tipc;
  250. if(tipc>0) {
  251. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  252. return(exit_status);
  253. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  254. return(exit_status);
  255. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  256. return(exit_status);
  257. }
  258. brkcnt = tipc;
  259. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  260. if(brkcnt>0) {
  261. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  262. return(exit_status);
  263. }
  264. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  265. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  266. return(exit_status);
  267. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  268. return(exit_status);
  269. }
  270. if((exit_status = mark_parameter_types(dz,ap))<0)
  271. return(exit_status);
  272. // establish_infile_constants() replaced by
  273. dz->infilecnt = 1;
  274. //establish_bufptrs_and_extra_buffers():
  275. return(FINISHED);
  276. }
  277. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  278. /* RWD mallo changed to calloc; helps debug verison run as release! */
  279. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  280. {
  281. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  282. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  283. return(MEMORY_ERROR);
  284. }
  285. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  286. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  287. return(MEMORY_ERROR);
  288. }
  289. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  290. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  291. return(MEMORY_ERROR);
  292. }
  293. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  294. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  295. return(MEMORY_ERROR);
  296. }
  297. return(FINISHED);
  298. }
  299. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  300. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  301. {
  302. int n;
  303. for(n=0;n<storage_cnt;n++) {
  304. dz->is_int[n] = (char)0;
  305. dz->no_brk[n] = (char)0;
  306. }
  307. return(FINISHED);
  308. }
  309. /***************************** MARK_PARAMETER_TYPES **************************/
  310. int mark_parameter_types(dataptr dz,aplptr ap)
  311. {
  312. int n, m; /* PARAMS */
  313. for(n=0;n<ap->max_param_cnt;n++) {
  314. switch(ap->param_list[n]) {
  315. case('0'): break; /* dz->is_active[n] = 0 is default */
  316. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  317. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  318. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  319. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  320. default:
  321. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  322. return(PROGRAM_ERROR);
  323. }
  324. } /* OPTIONS */
  325. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  326. switch(ap->option_list[n]) {
  327. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  328. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  329. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  330. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  331. default:
  332. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  333. return(PROGRAM_ERROR);
  334. }
  335. } /* VARIANTS */
  336. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  337. switch(ap->variant_list[n]) {
  338. case('0'): break;
  339. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  340. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  341. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  342. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  343. default:
  344. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  345. return(PROGRAM_ERROR);
  346. }
  347. } /* INTERNAL */
  348. for(n=0,
  349. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  350. switch(ap->internal_param_list[n]) {
  351. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  352. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  353. case('d'): dz->no_brk[m] = (char)1; break;
  354. default:
  355. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  356. return(PROGRAM_ERROR);
  357. }
  358. }
  359. return(FINISHED);
  360. }
  361. /************************ HANDLE_THE_OUTFILE *********************/
  362. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  363. {
  364. int exit_status;
  365. char *filename = (*cmdline)[0];
  366. if(filename[0]=='-' && filename[1]=='f') {
  367. dz->floatsam_output = 1;
  368. dz->true_outfile_stype = SAMP_FLOAT;
  369. filename+= 2;
  370. }
  371. if(!sloom) {
  372. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  373. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  374. return(DATA_ERROR);
  375. }
  376. }
  377. strcpy(dz->outfilename,filename);
  378. if((exit_status = create_sized_outfile(filename,dz))<0)
  379. return(exit_status);
  380. (*cmdline)++;
  381. (*cmdlinecnt)--;
  382. return(FINISHED);
  383. }
  384. /***************************** ESTABLISH_APPLICATION **************************/
  385. int establish_application(dataptr dz)
  386. {
  387. aplptr ap;
  388. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  389. sprintf(errstr,"establish_application()\n");
  390. return(MEMORY_ERROR);
  391. }
  392. ap = dz->application;
  393. memset((char *)ap,0,sizeof(struct applic));
  394. return(FINISHED);
  395. }
  396. /************************* INITIALISE_VFLAGS *************************/
  397. int initialise_vflags(dataptr dz)
  398. {
  399. int n;
  400. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  401. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  402. return(MEMORY_ERROR);
  403. }
  404. for(n=0;n<dz->application->vflag_cnt;n++)
  405. dz->vflag[n] = FALSE;
  406. return FINISHED;
  407. }
  408. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  409. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  410. {
  411. int n;
  412. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  413. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  414. return(MEMORY_ERROR);
  415. }
  416. for(n=0;n<tipc;n++)
  417. ap->default_val[n] = 0.0;
  418. return(FINISHED);
  419. }
  420. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  421. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  422. {
  423. int n;
  424. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  425. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  426. return(MEMORY_ERROR);
  427. }
  428. for(n=0;n<tipc;n++)
  429. dz->is_active[n] = (char)0;
  430. return(FINISHED);
  431. }
  432. /************************* SETUP_HOVER_APPLICATION *******************/
  433. int setup_hover_application(dataptr dz)
  434. {
  435. int exit_status;
  436. aplptr ap;
  437. if((exit_status = establish_application(dz))<0) // GLOBAL
  438. return(FAILED);
  439. ap = dz->application;
  440. // SEE parstruct FOR EXPLANATION of next 2 functions
  441. if((exit_status = set_param_data(ap,0 ,5,5,"DDDDd"))<0)
  442. return(FAILED);
  443. if((exit_status = set_vflgs(ap,"",0,"","sn",2,0,"00"))<0)
  444. return(FAILED);
  445. // set_legal_infile_structure -->
  446. dz->has_otherfile = FALSE;
  447. // assign_process_logic -->
  448. dz->input_data_type = SNDFILES_ONLY;
  449. dz->process_type = UNEQUAL_SNDFILE;
  450. dz->outfiletype = SNDFILE_OUT;
  451. return application_init(dz); //GLOBAL
  452. }
  453. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  454. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  455. {
  456. int exit_status;
  457. infileptr infile_info;
  458. if(!sloom) {
  459. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  460. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  461. return(MEMORY_ERROR);
  462. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  463. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  464. return(PROGRAM_ERROR);
  465. } else if(infile_info->filetype != SNDFILE) {
  466. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  467. return(DATA_ERROR);
  468. } else if(infile_info->channels != 1) {
  469. sprintf(errstr,"File %s is not of correct type (must be mono)\n",cmdline[0]);
  470. return(DATA_ERROR);
  471. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  472. sprintf(errstr,"Failed to copy file parsing information\n");
  473. return(PROGRAM_ERROR);
  474. }
  475. free(infile_info);
  476. }
  477. return(FINISHED);
  478. }
  479. /************************* SETUP_HOVER_PARAM_RANGES_AND_DEFAULTS *******************/
  480. int setup_hover_param_ranges_and_defaults(dataptr dz)
  481. {
  482. int exit_status;
  483. aplptr ap = dz->application;
  484. // set_param_ranges()
  485. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  486. // NB total_input_param_cnt is > 0 !!!
  487. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  488. return(FAILED);
  489. // get_param_ranges()
  490. ap->lo[0] = 1.0 / (dz->duration * 2.0);
  491. ap->hi[0] = dz->nyquist;
  492. ap->default_val[0] = 440.0;
  493. ap->lo[1] = 0.0;
  494. ap->hi[1] = dz->duration;
  495. ap->default_val[1] = dz->duration / 2.0;
  496. ap->lo[2] = 0.0;
  497. ap->hi[2] = 1.0;
  498. ap->default_val[2] = 0.1;
  499. ap->lo[3] = 0.0;
  500. ap->hi[3] = 1.0;
  501. ap->default_val[3] = 0.1;
  502. ap->lo[4] = 0.0;
  503. ap->hi[4] = 100.0;
  504. ap->default_val[4] = 1.0;
  505. dz->maxmode = 0;
  506. if(!sloom)
  507. put_default_vals_in_all_params(dz);
  508. return(FINISHED);
  509. }
  510. /********************************* PARSE_SLOOM_DATA *********************************/
  511. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  512. {
  513. int exit_status;
  514. int cnt = 1, infilecnt;
  515. int filesize, insams, inbrksize;
  516. double dummy;
  517. int true_cnt = 0;
  518. aplptr ap;
  519. while(cnt<=PRE_CMDLINE_DATACNT) {
  520. if(cnt > argc) {
  521. sprintf(errstr,"Insufficient data sent from TK\n");
  522. return(DATA_ERROR);
  523. }
  524. switch(cnt) {
  525. case(1):
  526. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  527. sprintf(errstr,"Cannot read process no. sent from TK\n");
  528. return(DATA_ERROR);
  529. }
  530. break;
  531. case(2):
  532. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  533. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  534. return(DATA_ERROR);
  535. }
  536. if(dz->mode > 0)
  537. dz->mode--;
  538. //setup_particular_application() =
  539. if((exit_status = setup_hover_application(dz))<0)
  540. return(exit_status);
  541. ap = dz->application;
  542. break;
  543. case(3):
  544. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  545. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  546. return(DATA_ERROR);
  547. }
  548. if(infilecnt < 1) {
  549. true_cnt = cnt + 1;
  550. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  551. }
  552. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  553. return(exit_status);
  554. break;
  555. case(INPUT_FILETYPE+4):
  556. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  557. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  558. return(DATA_ERROR);
  559. }
  560. break;
  561. case(INPUT_FILESIZE+4):
  562. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  563. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  564. return(DATA_ERROR);
  565. }
  566. dz->insams[0] = filesize;
  567. break;
  568. case(INPUT_INSAMS+4):
  569. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  570. sprintf(errstr,"Cannot read insams sent from TK\n");
  571. return(DATA_ERROR);
  572. }
  573. dz->insams[0] = insams;
  574. break;
  575. case(INPUT_SRATE+4):
  576. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  577. sprintf(errstr,"Cannot read srate sent from TK\n");
  578. return(DATA_ERROR);
  579. }
  580. break;
  581. case(INPUT_CHANNELS+4):
  582. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  583. sprintf(errstr,"Cannot read channels sent from TK\n");
  584. return(DATA_ERROR);
  585. }
  586. break;
  587. case(INPUT_STYPE+4):
  588. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  589. sprintf(errstr,"Cannot read stype sent from TK\n");
  590. return(DATA_ERROR);
  591. }
  592. break;
  593. case(INPUT_ORIGSTYPE+4):
  594. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  595. sprintf(errstr,"Cannot read origstype sent from TK\n");
  596. return(DATA_ERROR);
  597. }
  598. break;
  599. case(INPUT_ORIGRATE+4):
  600. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  601. sprintf(errstr,"Cannot read origrate sent from TK\n");
  602. return(DATA_ERROR);
  603. }
  604. break;
  605. case(INPUT_MLEN+4):
  606. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  607. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  608. return(DATA_ERROR);
  609. }
  610. break;
  611. case(INPUT_DFAC+4):
  612. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  613. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  614. return(DATA_ERROR);
  615. }
  616. break;
  617. case(INPUT_ORIGCHANS+4):
  618. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  619. sprintf(errstr,"Cannot read origchans sent from TK\n");
  620. return(DATA_ERROR);
  621. }
  622. break;
  623. case(INPUT_SPECENVCNT+4):
  624. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  625. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  626. return(DATA_ERROR);
  627. }
  628. dz->specenvcnt = dz->infile->specenvcnt;
  629. break;
  630. case(INPUT_WANTED+4):
  631. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  632. sprintf(errstr,"Cannot read wanted sent from TK\n");
  633. return(DATA_ERROR);
  634. }
  635. break;
  636. case(INPUT_WLENGTH+4):
  637. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  638. sprintf(errstr,"Cannot read wlength sent from TK\n");
  639. return(DATA_ERROR);
  640. }
  641. break;
  642. case(INPUT_OUT_CHANS+4):
  643. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  644. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  645. return(DATA_ERROR);
  646. }
  647. break;
  648. /* RWD these chanegs to samps - tk will have to deal with that! */
  649. case(INPUT_DESCRIPTOR_BYTES+4):
  650. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  651. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  652. return(DATA_ERROR);
  653. }
  654. break;
  655. case(INPUT_IS_TRANSPOS+4):
  656. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  657. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  658. return(DATA_ERROR);
  659. }
  660. break;
  661. case(INPUT_COULD_BE_TRANSPOS+4):
  662. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  663. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  664. return(DATA_ERROR);
  665. }
  666. break;
  667. case(INPUT_COULD_BE_PITCH+4):
  668. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  669. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  670. return(DATA_ERROR);
  671. }
  672. break;
  673. case(INPUT_DIFFERENT_SRATES+4):
  674. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  675. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  676. return(DATA_ERROR);
  677. }
  678. break;
  679. case(INPUT_DUPLICATE_SNDS+4):
  680. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  681. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  682. return(DATA_ERROR);
  683. }
  684. break;
  685. case(INPUT_BRKSIZE+4):
  686. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  687. sprintf(errstr,"Cannot read brksize sent from TK\n");
  688. return(DATA_ERROR);
  689. }
  690. if(inbrksize > 0) {
  691. switch(dz->input_data_type) {
  692. case(WORDLIST_ONLY):
  693. break;
  694. case(PITCH_AND_PITCH):
  695. case(PITCH_AND_TRANSPOS):
  696. case(TRANSPOS_AND_TRANSPOS):
  697. dz->tempsize = inbrksize;
  698. break;
  699. case(BRKFILES_ONLY):
  700. case(UNRANGED_BRKFILE_ONLY):
  701. case(DB_BRKFILES_ONLY):
  702. case(ALL_FILES):
  703. case(ANY_NUMBER_OF_ANY_FILES):
  704. if(dz->extrabrkno < 0) {
  705. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  706. return(DATA_ERROR);
  707. }
  708. if(dz->brksize == NULL) {
  709. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  710. return(PROGRAM_ERROR);
  711. }
  712. dz->brksize[dz->extrabrkno] = inbrksize;
  713. break;
  714. default:
  715. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  716. dz->input_data_type);
  717. return(PROGRAM_ERROR);
  718. }
  719. break;
  720. }
  721. break;
  722. case(INPUT_NUMSIZE+4):
  723. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  724. sprintf(errstr,"Cannot read numsize sent from TK\n");
  725. return(DATA_ERROR);
  726. }
  727. break;
  728. case(INPUT_LINECNT+4):
  729. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  730. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  731. return(DATA_ERROR);
  732. }
  733. break;
  734. case(INPUT_ALL_WORDS+4):
  735. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  736. sprintf(errstr,"Cannot read all_words sent from TK\n");
  737. return(DATA_ERROR);
  738. }
  739. break;
  740. case(INPUT_ARATE+4):
  741. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  742. sprintf(errstr,"Cannot read arate sent from TK\n");
  743. return(DATA_ERROR);
  744. }
  745. break;
  746. case(INPUT_FRAMETIME+4):
  747. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  748. sprintf(errstr,"Cannot read frametime sent from TK\n");
  749. return(DATA_ERROR);
  750. }
  751. dz->frametime = (float)dummy;
  752. break;
  753. case(INPUT_WINDOW_SIZE+4):
  754. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  755. sprintf(errstr,"Cannot read window_size sent from TK\n");
  756. return(DATA_ERROR);
  757. }
  758. break;
  759. case(INPUT_NYQUIST+4):
  760. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  761. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  762. return(DATA_ERROR);
  763. }
  764. break;
  765. case(INPUT_DURATION+4):
  766. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  767. sprintf(errstr,"Cannot read duration sent from TK\n");
  768. return(DATA_ERROR);
  769. }
  770. break;
  771. case(INPUT_MINBRK+4):
  772. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  773. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  774. return(DATA_ERROR);
  775. }
  776. break;
  777. case(INPUT_MAXBRK+4):
  778. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  779. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  780. return(DATA_ERROR);
  781. }
  782. break;
  783. case(INPUT_MINNUM+4):
  784. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  785. sprintf(errstr,"Cannot read minnum sent from TK\n");
  786. return(DATA_ERROR);
  787. }
  788. break;
  789. case(INPUT_MAXNUM+4):
  790. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  791. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  792. return(DATA_ERROR);
  793. }
  794. break;
  795. default:
  796. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  797. return(PROGRAM_ERROR);
  798. }
  799. cnt++;
  800. }
  801. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  802. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  803. return(DATA_ERROR);
  804. }
  805. if(true_cnt)
  806. cnt = true_cnt;
  807. *cmdlinecnt = 0;
  808. while(cnt < argc) {
  809. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  810. return(exit_status);
  811. cnt++;
  812. }
  813. return(FINISHED);
  814. }
  815. /********************************* GET_TK_CMDLINE_WORD *********************************/
  816. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  817. {
  818. if(*cmdlinecnt==0) {
  819. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  820. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  821. return(MEMORY_ERROR);
  822. }
  823. } else {
  824. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  825. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  826. return(MEMORY_ERROR);
  827. }
  828. }
  829. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  830. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  831. return(MEMORY_ERROR);
  832. }
  833. strcpy((*cmdline)[*cmdlinecnt],q);
  834. (*cmdlinecnt)++;
  835. return(FINISHED);
  836. }
  837. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  838. int assign_file_data_storage(int infilecnt,dataptr dz)
  839. {
  840. int exit_status;
  841. int no_sndfile_system_files = FALSE;
  842. dz->infilecnt = infilecnt;
  843. if((exit_status = allocate_filespace(dz))<0)
  844. return(exit_status);
  845. if(no_sndfile_system_files)
  846. dz->infilecnt = 0;
  847. return(FINISHED);
  848. }
  849. /************************* redundant functions: to ensure libs compile OK *******************/
  850. int assign_process_logic(dataptr dz)
  851. {
  852. return(FINISHED);
  853. }
  854. void set_legal_infile_structure(dataptr dz)
  855. {}
  856. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  857. {
  858. return(FINISHED);
  859. }
  860. int setup_internal_arrays_and_array_pointers(dataptr dz)
  861. {
  862. return(FINISHED);
  863. }
  864. int establish_bufptrs_and_extra_buffers(dataptr dz)
  865. {
  866. return(FINISHED);
  867. }
  868. int read_special_data(char *str,dataptr dz)
  869. {
  870. return(FINISHED);
  871. }
  872. int inner_loop
  873. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  874. {
  875. return(FINISHED);
  876. }
  877. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  878. {
  879. return(FINISHED);
  880. }
  881. /******************************** USAGE1 ********************************/
  882. int usage1(void)
  883. {
  884. usage2("hover2");
  885. return(USAGE_ONLY);
  886. }
  887. /**************************** CHECK_HOVER_PARAM_VALIDITY_AND_CONSISTENCY *****************************/
  888. int check_hover_param_validity_and_consistency(int *maxtraverse,dataptr dz)
  889. {
  890. int exit_status;
  891. double minval;
  892. if(dz->brksize[HOVER_FRQ] == 0) {
  893. dz->iparam[TRAVERSE] = (int)round(dz->infile->srate/dz->param[HOVER_FRQ]);
  894. *maxtraverse = dz->iparam[TRAVERSE];
  895. } else {
  896. if((exit_status = get_minvalue_in_brktable(&minval,0,dz)) < 0)
  897. return(exit_status);
  898. *maxtraverse = (int)round((double)dz->infile->srate/minval);
  899. }
  900. if(dz->brksize[HOVER_LOC] == 0)
  901. dz->iparam[HOVER_LOC] = (int)round(dz->infile->srate * dz->param[HOVER_LOC]);
  902. dz->iparam[HOVER_DUR2] = (int)round(dz->infile->srate * dz->param[HOVER_DUR2]);
  903. return FINISHED;
  904. }
  905. /********************************************************************************************/
  906. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  907. {
  908. if(!strcmp(prog_identifier_from_cmdline,"hover2")) dz->process = HOVER2;
  909. else {
  910. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  911. return(USAGE_ONLY);
  912. }
  913. return(FINISHED);
  914. }
  915. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  916. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  917. {
  918. int n;
  919. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  920. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  921. return(MEMORY_ERROR);
  922. }
  923. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  924. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  925. return(MEMORY_ERROR);
  926. }
  927. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  928. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  929. return(MEMORY_ERROR);
  930. }
  931. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  932. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  933. return(MEMORY_ERROR);
  934. }
  935. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  936. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  937. return(MEMORY_ERROR);
  938. }
  939. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  940. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  941. return(MEMORY_ERROR);
  942. }
  943. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  944. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  945. return(MEMORY_ERROR);
  946. }
  947. for(n=0;n<brkcnt;n++) {
  948. dz->brk[n] = NULL;
  949. dz->brkptr[n] = NULL;
  950. dz->brkinit[n] = 0;
  951. dz->brksize[n] = 0;
  952. }
  953. return(FINISHED);
  954. }
  955. /******************************** USAGE2 ********************************/
  956. int usage2(char *str)
  957. {
  958. if(!strcmp(str,"hover2")) {
  959. fprintf(stdout,
  960. "USAGE:\n"
  961. "hover2 hover2 infile outfile frq loc frqrand locrand dur [-s] [-n]\n"
  962. "\n"
  963. "move through a file, zigzag reading it at a given frequency,\n"
  964. "reading back and forth from a zero-crossing,\n"
  965. "then outputting same data inverted,\n"
  966. "to form symmetrical zero-centred waveforms at each read.\n"
  967. "\n"
  968. "FRQ rate of reading source-samples (in Hz).\n"
  969. " determines samplewidth of zigzag-read. e.g. at srate 44100,\n"
  970. " frq 1 Hz, reads 22050 samps forward, & 22050 samps back.\n"
  971. " frq 10 Hz, reads 2205 samps forward, & 2205 samps back.\n"
  972. "LOC Time in sourcefile near which samples are read.\n"
  973. "FRQRAND Random variation of frequency, (0-1).\n"
  974. "LOCRAND Random variation of location, (0-1).\n"
  975. "DUR total output duration.\n"
  976. "-s STEP between locations at times specified in any brkpnt file\n"
  977. " (rather than interpolating between the locations as time progresses).\n"
  978. "-n NORMALISE the loudness of all wavecycles generated.\n"
  979. "\n"
  980. "frq and loc (frqrand and locrand) may vary through time.\n"
  981. "time in any brkpoint files is time in output-file.\n"
  982. "\n");
  983. } else
  984. fprintf(stdout,"Unknown option '%s'\n",str);
  985. return(USAGE_ONLY);
  986. }
  987. int usage3(char *str1,char *str2)
  988. {
  989. fprintf(stderr,"Insufficient parameters on command line.\n");
  990. return(USAGE_ONLY);
  991. }
  992. /******************************** HOVER2 ********************************/
  993. int hover2(dataptr dz)
  994. {
  995. int exit_status, done, warned = 0, hover_splicelen = 0;
  996. double randvar, time, srate = (double)dz->infile->srate, maxsamp, normaliser;
  997. int samptime, randvarsamps;
  998. float *ibuf = dz->sampbuf[0];
  999. float *obuf = dz->sampbuf[1];
  1000. float *kbuf = dz->sampbuf[2];
  1001. int ibufpos, obufpos, abs_startreadbuf, abs_endreadbuf, readlimit;
  1002. int traverse, location, quarter_cycle;
  1003. int n, m;
  1004. double splincr = 0.0, spliceval = 0.0;
  1005. int splicelen = 0;
  1006. hover_splicelen = (int)round(HOVER_SPLIC * dz->infile->srate);
  1007. obufpos = 0;
  1008. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1009. if((exit_status = read_samps(ibuf,dz))<0)
  1010. return(exit_status);
  1011. samptime = 0;
  1012. time = 0.0;
  1013. abs_startreadbuf = 0;
  1014. abs_endreadbuf = dz->ssampsread;
  1015. /* No point in attempting to read buffers too close to end of file */
  1016. if(dz->insams[0] < dz->buflen)
  1017. readlimit = 0;
  1018. else {
  1019. readlimit = (dz->insams[0] - dz->buflen)/F_SECSIZE;
  1020. readlimit *= F_SECSIZE;
  1021. if(dz->insams[0] - readlimit > dz->buflen)
  1022. readlimit += F_SECSIZE;
  1023. }
  1024. while(samptime < dz->iparam[HOVER_DUR2]) {
  1025. /* Initialise process by finding first frq, first location, (including randomisings) */
  1026. if(dz->vflag[0]) {
  1027. for(n=0;n<4;n++) {
  1028. if(n==HOVER_LOC) {
  1029. if(dz->brksize[HOVER_LOC]) {
  1030. if((exit_status = stepread_value_from_brktable(time,HOVER_LOC,dz))<0)
  1031. return(exit_status);
  1032. }
  1033. } else {
  1034. if(dz->brksize[n]) {
  1035. if((exit_status = read_value_from_brktable(time,n,dz))<0)
  1036. return(exit_status);
  1037. }
  1038. }
  1039. }
  1040. } else {
  1041. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1042. return(exit_status);
  1043. }
  1044. /* TRAVERSE = TOTAL zig+zag read, in samples */
  1045. if(dz->brksize[HOVER_FRQ] > 0)
  1046. dz->iparam[TRAVERSE] = (int)round(srate/dz->param[HOVER_FRQ]);
  1047. traverse = dz->iparam[TRAVERSE];
  1048. /* LOCATION */
  1049. if(dz->brksize[HOVER_LOC] > 0)
  1050. dz->iparam[HOVER_LOC] = (int)round(srate * dz->param[HOVER_LOC]);
  1051. location = dz->iparam[HOVER_LOC];
  1052. /* RANDVAR of LOCATION */
  1053. if(dz->param[HOVER_LOCR] > 0.0) {
  1054. randvar = (drand48() * 2.0) - 1.0; /* range -1 to +1 */
  1055. randvar *= dz->param[HOVER_LOCR]; /* range -HOVER_LOCR to +HOVER_LOCR */
  1056. randvarsamps = (int)round(traverse * randvar);
  1057. /* random variation in location is random relative width of current hover-traverse */
  1058. /* rather than random relative to the total file duration */
  1059. location += randvarsamps;
  1060. }
  1061. if(location < 0)
  1062. location = 0;
  1063. if(location >= dz->insams[0])
  1064. location = dz->insams[0] - 1;
  1065. /* TRAVERSE, RAND VARIATION */
  1066. if(dz->param[HOVER_FRQR] > 0.0) {
  1067. randvar = (drand48() * 2.0) - 1.0; /* range -1 to +1 */
  1068. randvar *= dz->param[HOVER_FRQR]; /* range -HOVER_FRQR to +HOVER_FRQR */
  1069. randvarsamps = (int)round(traverse * randvar);
  1070. traverse = traverse + randvarsamps;
  1071. }
  1072. traverse = (int)round(traverse/4);
  1073. traverse *= 4;
  1074. if(traverse <4)
  1075. traverse = 4;
  1076. quarter_cycle = traverse/4;
  1077. time += (double)traverse/srate;
  1078. samptime += traverse;
  1079. if(location >= abs_endreadbuf || location < abs_startreadbuf) {
  1080. abs_startreadbuf = location/F_SECSIZE;
  1081. abs_startreadbuf *= F_SECSIZE; /* align new read with sector size */
  1082. if(abs_startreadbuf > readlimit)
  1083. abs_startreadbuf = readlimit;
  1084. if((sndseekEx(dz->ifd[0],abs_startreadbuf,0)<0)){
  1085. sprintf(errstr,"sndseek() failed\n");
  1086. return SYSTEM_ERROR;
  1087. }
  1088. if((exit_status = read_samps(ibuf,dz))<0)
  1089. return exit_status;
  1090. abs_endreadbuf = abs_startreadbuf + dz->ssampsread;
  1091. }
  1092. ibufpos = location - abs_startreadbuf;
  1093. // FIND DOWNWARD ZERO-CROSSING
  1094. done = 0;
  1095. while(ibuf[ibufpos] <= 0.0) {
  1096. ibufpos++;
  1097. if(abs_startreadbuf + ibufpos >= dz->insams[0]) {
  1098. if(!warned) {
  1099. sprintf(errstr,"WARNING: Location too close to end of file at time %lf\n",time);
  1100. fflush(stdout);
  1101. }
  1102. warned = 1;
  1103. done = 1;
  1104. break;
  1105. }
  1106. if(ibufpos >= dz->buflen) {
  1107. abs_startreadbuf = abs_endreadbuf;
  1108. if((exit_status = read_samps(ibuf,dz))<0)
  1109. return exit_status;
  1110. abs_endreadbuf = abs_startreadbuf + dz->ssampsread;
  1111. }
  1112. }
  1113. if(done)
  1114. continue;
  1115. while(ibuf[ibufpos] > 0.0) {
  1116. ibufpos++;
  1117. if(abs_startreadbuf + ibufpos >= dz->insams[0]) {
  1118. if(!warned) {
  1119. sprintf(errstr,"WARNING: Location too close to end of file at time %lf\n",time);
  1120. fflush(stdout);
  1121. }
  1122. warned = 1;
  1123. done = 1;
  1124. break;
  1125. }
  1126. if(ibufpos >= dz->buflen) {
  1127. abs_startreadbuf = abs_endreadbuf;
  1128. if((exit_status = read_samps(ibuf,dz))<0)
  1129. return exit_status;
  1130. abs_endreadbuf = abs_startreadbuf + dz->ssampsread;
  1131. }
  1132. }
  1133. if(done)
  1134. continue;
  1135. // DO THE CYCLE
  1136. for(n = 0;n <= quarter_cycle;n++) {
  1137. kbuf[n] = ibuf[ibufpos++];
  1138. if(abs_startreadbuf + ibufpos >= dz->insams[0]) {
  1139. if(!warned) {
  1140. sprintf(errstr,"WARNING: Location too close to end of file at time %lf\n",time);
  1141. fflush(stdout);
  1142. }
  1143. warned = 1;
  1144. done = 1;
  1145. break;
  1146. }
  1147. if(ibufpos >= dz->buflen) {
  1148. abs_startreadbuf = abs_endreadbuf;
  1149. if((exit_status = read_samps(ibuf,dz))<0)
  1150. return exit_status;
  1151. abs_endreadbuf = abs_startreadbuf + dz->ssampsread;
  1152. }
  1153. }
  1154. if(done)
  1155. continue;
  1156. if(dz->vflag[1]) {
  1157. maxsamp = 0.0;
  1158. for(m = 0;m <= quarter_cycle;m++)
  1159. maxsamp = max(fabs(kbuf[m]),maxsamp);
  1160. if(maxsamp > 0.0) {
  1161. normaliser = 0.9/maxsamp;
  1162. for(m = 0;m <= quarter_cycle;m++)
  1163. kbuf[m] = (float)(kbuf[m] * normaliser);
  1164. }
  1165. }
  1166. // SMOOTHING INTRODUCED
  1167. splicelen = min(quarter_cycle/2,hover_splicelen);
  1168. splincr = 1.0/(double)splicelen;
  1169. spliceval = 0.0;
  1170. for(n = 0;n <= splicelen;n++) {
  1171. kbuf[n] = (float)(kbuf[n] * spliceval);
  1172. spliceval = min(spliceval + splincr,1.0);
  1173. }
  1174. spliceval = 0;
  1175. for(n = 0, m = quarter_cycle;n < splicelen;n++,m--) {
  1176. kbuf[m] = (float)(kbuf[m] * spliceval);
  1177. spliceval = min(spliceval + splincr,1.0);
  1178. }
  1179. for(n = 0;n <= quarter_cycle;n++) {
  1180. obuf[obufpos++] = kbuf[n];
  1181. if(obufpos >= dz->buflen) {
  1182. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1183. return(exit_status);
  1184. obufpos = 0;
  1185. }
  1186. }
  1187. n-=2;
  1188. for(/*n*/; n > 0;n--) { //RWD don't need to state n here
  1189. obuf[obufpos++] = kbuf[n];
  1190. if(obufpos >= dz->buflen) {
  1191. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1192. return(exit_status);
  1193. obufpos = 0;
  1194. }
  1195. }
  1196. for(n = 0;n <= quarter_cycle;n++) {
  1197. obuf[obufpos++] = -kbuf[n];
  1198. if(obufpos >= dz->buflen) {
  1199. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1200. return(exit_status);
  1201. obufpos = 0;
  1202. }
  1203. }
  1204. n-=2;
  1205. for(/* n */; n > 0;n--) { //RWD as above
  1206. obuf[obufpos++] = -kbuf[n];
  1207. if(obufpos >= dz->buflen) {
  1208. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1209. return(exit_status);
  1210. obufpos = 0;
  1211. }
  1212. }
  1213. }
  1214. if(obufpos > 0) {
  1215. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  1216. return(exit_status);
  1217. }
  1218. return FINISHED;
  1219. }
  1220. /*************************** CREATE_HOVER2_SNDBUFS **************************/
  1221. /* 2009 MULTICHANNEL */
  1222. int create_hover2_sndbufs(int maxtraverse,dataptr dz)
  1223. {
  1224. int n;
  1225. int bigbufsize;
  1226. int framesize;
  1227. framesize = F_SECSIZE * dz->infile->channels;
  1228. if(dz->sbufptr == 0 || dz->sampbuf==0) {
  1229. sprintf(errstr,"buffer pointers not allocated: create_sndbufs()\n");
  1230. return(PROGRAM_ERROR);
  1231. }
  1232. bigbufsize = (int)Malloc(-1);
  1233. bigbufsize /= dz->bufcnt;
  1234. if(bigbufsize <=0)
  1235. bigbufsize = framesize * sizeof(float);
  1236. dz->buflen = bigbufsize / sizeof(float);
  1237. dz->buflen = (dz->buflen / framesize) * framesize;
  1238. if(dz->buflen < maxtraverse) {
  1239. n = maxtraverse/framesize;
  1240. if(n * framesize < maxtraverse)
  1241. n++;
  1242. dz->buflen = framesize * n;
  1243. }
  1244. bigbufsize = dz->buflen * sizeof(float);
  1245. if(bigbufsize < 0) {
  1246. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers (minimum Hover rate too low).\n");
  1247. return(MEMORY_ERROR);
  1248. }
  1249. for(n=0;n<dz->bufcnt;n++) {
  1250. if((dz->sampbuf[n] = (float *)malloc(bigbufsize)) == NULL) {
  1251. switch(n) {
  1252. case(0): sprintf(errstr,"INSUFFICIENT MEMORY to create input sound buffer (minimum Hover rate too low).\n"); break;
  1253. case(1): sprintf(errstr,"INSUFFICIENT MEMORY to create output sound buffer (minimum Hover rate too low).\n"); break;
  1254. case(2): sprintf(errstr,"INSUFFICIENT MEMORY to create calculation sound buffer (minimum Hover rate too low).\n"); break;
  1255. }
  1256. return(MEMORY_ERROR);
  1257. }
  1258. dz->sbufptr[n] = dz->sampbuf[n];
  1259. }
  1260. dz->sampbuf[n] = dz->sampbuf[n-1] + dz->buflen;
  1261. return(FINISHED);
  1262. }
  1263. /**************************** STEPREAD_VALUE_FROM_BRKTABLE *****************************/
  1264. int stepread_value_from_brktable(double thistime,int paramno,dataptr dz)
  1265. {
  1266. double *p;
  1267. int n;
  1268. p = dz->brk[paramno];
  1269. n = 0;
  1270. while(thistime > *p) {
  1271. p +=2;
  1272. n++;
  1273. if(n >= dz->brksize[paramno])
  1274. break;
  1275. }
  1276. if(n > 0)
  1277. n--;
  1278. n *= 2;
  1279. n++;
  1280. dz->param[paramno] = dz->brk[paramno][n];
  1281. return(FINISHED);
  1282. }