From fc3d3c0a4f110a23335398c327ac0a4fc949d5cb Mon Sep 17 00:00:00 2001 From: Guenter Geiger Date: Mon, 17 Jun 2002 10:13:57 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r12, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/ggee/; revision=13 --- tools/define_loudspeakers.c | 142 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100755 tools/define_loudspeakers.c (limited to 'tools/define_loudspeakers.c') diff --git a/tools/define_loudspeakers.c b/tools/define_loudspeakers.c new file mode 100755 index 0000000..14abe5c --- /dev/null +++ b/tools/define_loudspeakers.c @@ -0,0 +1,142 @@ +/* define_loudspeakers.c 0.1 +(c) Ville Pulkki 2.2.1999 Helsinki University of Technology*/ + +#include +#include "define_loudspeakers.h" + + +void load_ls_triplets(ls lss[MAX_LS_AMOUNT], + struct ls_triplet_chain **ls_triplets, + int ls_amount, char *filename) +{ + struct ls_triplet_chain *trip_ptr, *prev; + int i,j,k; + FILE *fp; + char c[10000]; + char *toke; + + trip_ptr = *ls_triplets; + prev = NULL; + while (trip_ptr != NULL){ + prev = trip_ptr; + trip_ptr = trip_ptr->next; + } + + if((fp=fopen(filename,"r")) == NULL){ + fprintf(stderr,"Could not open loudspeaker setup file.\n"); + exit(-1); + } + + while(1) { + if(fgets(c,10000,fp) == NULL) + break; + toke = (char *) strtok(c, " "); + if(sscanf(toke, "%d",&i)>0){ + toke = (char *) strtok(NULL," "); + sscanf(toke, "%d",&j); + toke = (char *) strtok(NULL," "); + sscanf(toke, "%d",&k); + } else { + break; + } + + trip_ptr = (struct ls_triplet_chain*) + malloc (sizeof (struct ls_triplet_chain)); + + if(prev == NULL) + *ls_triplets = trip_ptr; + else + prev->next = trip_ptr; + + trip_ptr->next = NULL; + trip_ptr->ls_nos[0] = i-1; + trip_ptr->ls_nos[1] = j-1; + trip_ptr->ls_nos[2] = k-1; + prev=trip_ptr; + trip_ptr=NULL; + } +} + + + +main(int argc,char **argv) + /* Inits the loudspeaker data. Calls choose_ls_tuplets or _triplets + according to current dimension. The inversion matrices are + stored in transposed form to ease calculation at run time.*/ +{ + char *s; + int dim; + float tmp; + struct ls_triplet_chain *ls_triplets = NULL; + ls lss[MAX_LS_AMOUNT]; + char c[10000]; + char *toke; + ang_vec a_vector; + cart_vec c_vector; + int i=0,j; + float azi, ele; + int ls_amount; + FILE *fp; + + if(argc != 2 && argc != 3){ + fprintf(stderr,"Usage: define_loudspeakers loudspeaker_directions_file [loudspeaker_triplet_file]\n"); + exit(-1); + } + + if((fp=fopen(argv[1],"r")) == NULL){ + fprintf(stderr,"Could not open loudspeaker setup file.%s\n",argv[1]); + exit(-1); + } + + + fgets(c,10000,fp); + toke = (char *) strtok(c, " "); + sscanf(toke, "%d",&dim); + if (!((dim==2) || (dim == 3))){ + fprintf(stderr,"Error in loudspeaker dimension.\n"); + exit (-1); + } + printf("File: %s ",argv[1]); + while(1) { + if(fgets(c,10000,fp) == NULL) + break; + toke = (char *) strtok(c, " "); + if(sscanf(toke, "%f",&azi)>0){ + if(dim == 3) { + toke = (char *) strtok(NULL," "); + sscanf(toke, "%f",&ele); + } else if(dim == 2) { + ele=0.0; + } + } else { + break; + } + + a_vector.azi = azi; + a_vector.ele = ele; + angle_to_cart(&a_vector,&c_vector); + lss[i].coords.x = c_vector.x; + lss[i].coords.y = c_vector.y; + lss[i].coords.z = c_vector.z; + lss[i].angles.azi = a_vector.azi; + lss[i].angles.ele = a_vector.ele; + lss[i].angles.length = 1.0; + i++; + } + ls_amount = i; + if(ls_amount < dim) { + fprintf(stderr,"Too few loudspeakers %d\n",ls_amount); + exit (-1); + } + + if(dim == 3){ + if(argc==2) /* select triplets */ + choose_ls_triplets(lss, &ls_triplets,ls_amount); + else /* load triplets from a file */ + load_ls_triplets(lss, &ls_triplets,ls_amount,argv[2]); + calculate_3x3_matrixes(ls_triplets,lss,ls_amount); + } else if (dim ==2) { + choose_ls_tuplets(lss, &ls_triplets,ls_amount); + } +} + -- cgit v1.2.1