void choose_ls_tuplets( ls lss[MAX_LS_AMOUNT], ls_triplet_chain **ls_triplets, int ls_amount, LS_DATA *ls_data) /* selects the loudspeaker pairs, calculates the inversion matrices and stores the data to a global array*/ { float atorad = (2 * 3.1415927 / 360) ; int i,j,k; float w1,w2; float p1,p2; int sorted_lss[MAX_LS_AMOUNT]; int exist[MAX_LS_AMOUNT]; int amount=0; float inv_mat[MAX_LS_AMOUNT][4], *ptr; float *ls_table; for(i=0;i<MAX_LS_AMOUNT;i++){ exist[i]=0; } /* sort loudspeakers according their aximuth angle */ sort_2D_lss(lss,sorted_lss,ls_amount); /* adjacent loudspeakers are the loudspeaker pairs to be used.*/ for(i=0;i<(ls_amount-1);i++){ if((lss[sorted_lss[i+1]].angles.azi - lss[sorted_lss[i]].angles.azi) <= (3.1415927 - 0.175)){ if (calc_2D_inv_tmatrix( lss[sorted_lss[i]].angles.azi, lss[sorted_lss[i+1]].angles.azi, inv_mat[i]) != 0){ exist[i]=1; amount++; } } } if(((6.283 - lss[sorted_lss[ls_amount-1]].angles.azi) +lss[sorted_lss[0]].angles.azi) <= (3.1415927 - 0.175)) { if(calc_2D_inv_tmatrix(lss[sorted_lss[ls_amount-1]].angles.azi, lss[sorted_lss[0]].angles.azi, inv_mat[ls_amount-1]) != 0) { exist[ls_amount-1]=1; amount++; } } ls_table = (float*) malloc ((amount * 6 + 3 + 100 ) * sizeof (float)); ls_table[0] = 2.0; /*dimension*/ ls_table[1] = (float) ls_amount; ls_table[2] = (float) amount; ptr = &(ls_table[3]); for (i=0;i<ls_amount - 1;i++){ if(exist[i] == 1) { *(ptr++) = sorted_lss[i]+1; *(ptr++) = sorted_lss[i+1]+1; for(j=0;j<4;j++) { *(ptr++) = inv_mat[i][j]; } } } if(exist[ls_amount-1] == 1) { *(ptr++) = sorted_lss[ls_amount-1]+1; *(ptr++) = sorted_lss[0]+1; for(j=0;j<4;j++) { *(ptr++) = inv_mat[ls_amount-1][j]; } } k=3; printf("Configured %d pairs in 2 dimensions:\n",amount); for(i=0 ; i < amount ; i++) { printf("Pair %d Loudspeakers: ", i); for (j=0 ; j < 2 ; j++) { ls_data->lstripl[i][j]=(int) ls_table[k]; printf("%d ", (int) ls_table[k++]); } ls_data->lstripl[i][2]=0; printf(" Matrix "); for (j=0 ; j < 4; j++) { ls_data->lsm[i][j]=(double) ls_table[k]; printf("%f ", ls_table[k]); k++; } for (j=4 ; j < 9; j++) { ls_data->lsm[i][j]=0.0; } printf("\n"); } ls_data->triplet_amount=amount; ls_data->dimension=2; ls_data->numchannels=ls_amount; }
static void choose_ls_tuplets(t_def_ls *x) /* selects the loudspeaker pairs, calculates the inversion matrices and stores the data to a global array*/ { //t_float atorad = (2 * 3.1415927 / 360) ; int i,j; //t_float w1,w2; //t_float p1,p2; int sorted_lss[MAX_LS_AMOUNT]; int exist[MAX_LS_AMOUNT]; int amount=0; t_float inv_mat[MAX_LS_AMOUNT][4]; // In 2-D ls amount == max amount of LS pairs t_float mat[MAX_LS_AMOUNT][4]; //t_float *ptr; //t_float *ls_table; t_ls *lss = x->x_ls; long ls_amount=x->x_def_ls_amount; long list_length; Atom *at; long pointer; for(i=0;i<MAX_LS_AMOUNT;i++){ exist[i]=0; } /* sort loudspeakers according their aximuth angle */ sort_2D_lss(x->x_ls,sorted_lss,ls_amount); /* adjacent loudspeakers are the loudspeaker pairs to be used.*/ for(i=0;i<(ls_amount-1);i++){ if((lss[sorted_lss[i+1]].azi - lss[sorted_lss[i]].azi) <= (180 - 10)){ if (calc_2D_inv_tmatrix( lss[sorted_lss[i]].azi, lss[sorted_lss[i+1]].azi, inv_mat[i],mat[i]) != 0){ exist[i]=1; amount++; } } } if(((360 - lss[sorted_lss[ls_amount-1]].azi) +lss[sorted_lss[0]].azi) <= (180 - 10)) { if(calc_2D_inv_tmatrix(lss[sorted_lss[ls_amount-1]].azi, lss[sorted_lss[0]].azi, inv_mat[ls_amount-1],mat[ls_amount-1]) != 0) { exist[ls_amount-1]=1; amount++; } } // Output list_length= amount * 10 + 2; at= (Atom *) getbytes(list_length*sizeof(Atom)); SETLONG(&at[0], x->x_def_ls_dimension); SETLONG(&at[1], x->x_def_ls_amount); pointer=2; for (i=0;i<ls_amount - 1;i++){ if(exist[i] == 1) { SETLONG(&at[pointer], sorted_lss[i]+1); pointer++; SETLONG(&at[pointer], sorted_lss[i+1]+1); pointer++; for(j=0;j<4;j++) { SETFLOAT(&at[pointer], inv_mat[i][j]); pointer++; } for(j=0;j<4;j++) { SETFLOAT(&at[pointer], mat[i][j]); pointer++; } } } if(exist[ls_amount-1] == 1) { SETLONG(&at[pointer], sorted_lss[ls_amount-1]+1); pointer++; SETLONG(&at[pointer], sorted_lss[0]+1); pointer++; for(j=0;j<4;j++) { SETFLOAT(&at[pointer], inv_mat[ls_amount-1][j]); pointer++; } for(j=0;j<4;j++) { SETFLOAT(&at[pointer], mat[ls_amount-1][j]); pointer++; } } sendLoudspeakerMatrices(x,list_length, at); //outlet_anything(x->x_outlet0, gensym("loudspeaker-matrices"), list_length, at); freebytes(at, list_length*sizeof(Atom)); }