コード例 #1
0
ファイル: vbap.c プロジェクト: Salimlou/AudioAnecdotes
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;
}
コード例 #2
0
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));
}