Exemplo n.º 1
0
static void
xmms_replaygain_config_changed (xmms_object_t *obj, xmmsv_t *_val, gpointer udata)
{
    const gchar *name;
    xmms_xform_t *xform = udata;
    xmms_replaygain_data_t *data;
    gboolean dirty = FALSE;
    const char *value;

    data = xmms_xform_private_data_get (xform);
    g_return_if_fail (data);

    name = xmms_config_property_get_name ((xmms_config_property_t *) obj);
    value = xmms_config_property_get_string ((xmms_config_property_t *) obj);

    if (!g_ascii_strcasecmp (name, "replaygain.mode")) {
        data->mode = parse_mode (value);
        dirty = TRUE;
    } else if (!g_ascii_strcasecmp (name,
                                    "replaygain.use_anticlip")) {
        data->use_anticlip = !!atoi (value);
        dirty = TRUE;
    } else if (!g_ascii_strcasecmp (name,
                                    "replaygain.preamp")) {
        data->preamp = pow (10.0, atof (value) / 20.0);
        dirty = TRUE;
    } else if (!g_ascii_strcasecmp (name, "replaygain.enabled")) {
        data->enabled = !!atoi (value);
    }

    if (dirty) {
        compute_gain (xform, data);
    }
}
Exemplo n.º 2
0
static float volume_echo_avoider_process(Volume *v, mblk_t *om) {
	static int counter;
	float peer_e,peer_pk;
	int nsamples = ((om->b_wptr - om->b_rptr) / 2);
	float mic_spk_ratio;
	peer_e = ((Volume *)(v->peer->data))->energy;
	peer_pk=((Volume *)(v->peer->data))->energy;
	
	if (peer_pk>v->lt_speaker_en)
		v->lt_speaker_en=peer_pk;
	else v->lt_speaker_en=(0.005*peer_pk)+(0.995*v->lt_speaker_en);
	mic_spk_ratio=(v->energy/(v->lt_speaker_en+v->ea_thres));
	
	/* where v->target_gain is not set, it is kept steady - not to modify elsewhere! */
	if (peer_e > v->ea_thres) {
		if (mic_spk_ratio>v->ea_transmit_thres){
			ms_message("Local mic is capturing louder than speaker output mic_spk_ratio=%f",mic_spk_ratio);
			v->target_gain=v->static_gain;
			v->fast_upramp=TRUE;
		}else{
			/*lower our gain when peer above threshold*/
			v->target_gain = compute_gain(v, peer_e, v->force);
			v->sustain_dur = v->sustain_time;
		}
	}else {
		if (v->sustain_dur > 0) {
			/*restore normal gain when INITIAL (soft start) call OR timeout */
			v->sustain_dur -= (nsamples * 1000) / v->sample_rate;
		}
		else{
			v->target_gain = v->static_gain;
			v->fast_upramp=TRUE;
		}
	}
	if (!(++counter % 20))
		ms_message("volume_echo_avoider_process(): mic_en=%f, peer_e=%f, target_g=%f, gain=%f, spk_peak=%f",
		             v->energy, peer_e, v->target_gain, v->gain, v->lt_speaker_en);
	return v->target_gain;
}
Exemplo n.º 3
0
static gboolean
xmms_replaygain_init (xmms_xform_t *xform)
{
    xmms_replaygain_data_t *data;
    xmms_config_property_t *cfgv;
    xmms_sample_format_t fmt;

    g_return_val_if_fail (xform, FALSE);

    data = g_new0 (xmms_replaygain_data_t, 1);
    g_return_val_if_fail (data, FALSE);

    xmms_xform_private_data_set (xform, data);

    cfgv = xmms_xform_config_lookup (xform, "mode");
    xmms_config_property_callback_set (cfgv,
                                       xmms_replaygain_config_changed,
                                       xform);

    data->mode = parse_mode (xmms_config_property_get_string (cfgv));

    cfgv = xmms_xform_config_lookup (xform, "use_anticlip");
    xmms_config_property_callback_set (cfgv,
                                       xmms_replaygain_config_changed,
                                       xform);

    data->use_anticlip = !!xmms_config_property_get_int (cfgv);

    cfgv = xmms_xform_config_lookup (xform, "preamp");
    xmms_config_property_callback_set (cfgv,
                                       xmms_replaygain_config_changed,
                                       xform);

    data->preamp = pow (10.0, atof (xmms_config_property_get_string (cfgv)) / 20.0);

    cfgv = xmms_xform_config_lookup (xform, "enabled");
    xmms_config_property_callback_set (cfgv,
                                       xmms_replaygain_config_changed,
                                       xform);

    data->enabled = !!xmms_config_property_get_int (cfgv);

    xmms_xform_outdata_type_copy (xform);

    compute_gain (xform, data);

    fmt = xmms_xform_indata_get_int (xform, XMMS_STREAM_TYPE_FMT_FORMAT);

    switch (fmt) {
    case XMMS_SAMPLE_FORMAT_S8:
        data->apply = apply_s8;
        break;
    case XMMS_SAMPLE_FORMAT_U8:
        data->apply = apply_u8;
        break;
    case XMMS_SAMPLE_FORMAT_S16:
        data->apply = apply_s16;
        break;
    case XMMS_SAMPLE_FORMAT_U16:
        data->apply = apply_u16;
        break;
    case XMMS_SAMPLE_FORMAT_S32:
        data->apply = apply_s32;
        break;
    case XMMS_SAMPLE_FORMAT_U32:
        data->apply = apply_u32;
        break;
    case XMMS_SAMPLE_FORMAT_FLOAT:
        data->apply = apply_float;
        break;
    case XMMS_SAMPLE_FORMAT_DOUBLE:
        data->apply = apply_double;
        break;
    default:
        /* we shouldn't ever get here, since we told the daemon
         * earlier about this list of supported formats.
         */
        g_assert_not_reached ();
        break;
    }

    return TRUE;
}
Exemplo n.º 4
0
void map_MPIPP(tm_topology_t *topology,int nb_seed,int N,int *Value,double **comm, double **arch)
{
  int *sol = NULL;
  int *state = NULL;
  double **gain = NULL;
  int **history = NULL;
  double *temp = NULL;
  int i,j,t,l=0,m=0,seed=0;
  double max,sum,best_eval,eval;

  gain = (double**)MALLOC(sizeof(double*)*N);
  history = (int**)MALLOC(sizeof(int*)*N);
  for( i = 0 ; i < N ; i++){
    gain[i] = (double*)MALLOC(sizeof(double)*N);
    history[i] = (int*)MALLOC(sizeof(int)*3);
  }

  state = (int*)MALLOC(sizeof(int)*N);
  temp = (double*)MALLOC(sizeof(double)*N);

  sol = generate_random_sol(topology,N,topology->nb_levels-1,seed++);
  for( i = 0 ; i < N ; i++)
    Value[i] = sol[i];

  best_eval = DBL_MAX;
  while(seed <= nb_seed){
    do{
      for( i =  0 ; i < N ; i++ ){
	state[i] = 0;
	/* printf("%d ",sol[i]); */
      }
      /* printf("\n"); */
      compute_gain(sol,N,gain,comm,arch);
      /*
      display_tab(gain,N);
      exit(-1);
      */
      for( i = 0 ; i < N/2 ; i++ ){
	select_max(&l,&m,gain,N,state);
	/* printf("%d: %d <=> %d : %f\n",i,l,m,gain[l][m]); */
	state[l] = 1;
	state[m] = 1;
	exchange(sol,l,m);
	history[i][1] = l;
	history[i][2] = m;
	temp[i] = gain[l][m];
	compute_gain(sol,N,gain,comm,arch);
      }

      t = -1;
      max = 0;
      sum = 0;
      for(i = 0 ; i < N/2 ; i++ ){
	sum += temp[i];
	if( sum > max ){
	  max = sum;
	  t = i;
	}
      }
      /*for(j=0;j<=t;j++)
	printf("exchanging: %d with %d for gain: %f\n",history[j][1],history[j][2],temp[j]); */
      for( j = t+1 ; j < N/2 ; j++ ){
	exchange(sol,history[j][1],history[j][2]);
	/* printf("Undoing: %d with %d for gain: %f\n",history[j][1],history[j][2],temp[j]);  */
      }
      /* printf("max=%f\n",max); */

      /*for(i=0;i<N;i++){
	printf("%d ",sol[i]);
	}
	printf("\n");*/
      eval = eval_sol(sol,N,comm,arch);
      if(eval < best_eval){
	best_eval = eval;
	for(i = 0 ; i < N ; i++)
	  Value[i] = sol[i];
	/* print_sol(N); */
      }
    }while( max > 0 );

    FREE(sol);
    sol=generate_random_sol(topology,N,topology->nb_levels-1,seed++);
  }
  FREE(sol);
  FREE(temp);
  FREE(state);
  for( i = 0 ; i < N ; i++){
    FREE(gain[i]);
    FREE(history[i]);
  }
  FREE(gain);
  FREE(history);
}
Exemplo n.º 5
0
 void map_MPIPP(int nb_seed,int N,int *Value,int **comm, int **arch){
   int *sol;
   int *state;
   double **gain;
   int **history;
   double *temp;
   int i,j,t,l=0,m=0,loop=0,seed=0;
   double max,sum,best_eval,eval;


   gain=(double**)malloc(sizeof(double*)*N);
   for(i=0;i<N;i++){
     gain[i]=(double*)malloc(sizeof(double)*N);
     if(!gain[i]){
     }
   }
   history=(int**)malloc(sizeof(int*)*N);
   for(i=0;i<N;i++)
     history[i]=(int*)malloc(sizeof(int)*3);

   state=(int*)malloc(sizeof(int)*N);
   temp=(double*)malloc(sizeof(double)*N);

   sol=generate_random_sol(N,0,seed++);
   for(i=0;i<N;i++)
     Value[i]=sol[i];

   best_eval=DBL_MAX;
while(seed<=nb_seed){
     loop=0;
     do{

       for(i=0;i<N;i++){
         state[i]=0;
         PRINTF(("%d ",sol[i]));
       }
       PRINTF(("\n"));
       compute_gain(sol,N,gain,comm,arch);

/*	for(i=0;i<N;i++){
             for(j=0;j<N;j++){
                printf("%d ",comm[i][j]);
        }
        printf("\n");
        }
	for(i=0;i<N;i++){
             for(j=0;j<N;j++){
                printf("%6.1f ",gain[i][j]);
        }
    	printf("\n");
        }
*/
//      display_tab(gain,N);
      //exit(-1);
       for(i=0;i<N/2;i++){
         select_max(&l,&m,gain,N,state);
         PRINTF(("%d: %d <=> %d : %f\n",i,l,m,gain[l][m]));
         state[l]=1;state[m]=1;
         exchange(sol,l,m);
	 for(j=0;j<N;j++){
                PRINTF(("%d ",sol[j]));
       }
	PRINTF(("\n"));
         history[i][1]=l;history[i][2]=m;
         temp[i]=gain[l][m];
         compute_gain(sol,N,gain,comm,arch);
       }

       t=-1;
       max=0;
       sum=0;
       for(i=0;i<N/2;i++){
         sum+=temp[i];
         if(sum>max){
           max=sum;
           t=i;
         }
       }
       for(j=0;j<=t;j++)
         PRINTF(("exchanging: %d with %d for gain: %f\n",history[j][1],history[j][2],temp[j])); 
       for(j=t+1;j<N/2;j++){
         exchange(sol,history[j][1],history[j][2]);
         PRINTF(("Undoing: %d with %d for gain: %f\n",history[j][1],history[j][2],temp[j]));
       }
       PRINTF(("max=%f\n",max));
      for(i=0;i<N;i++){
         PRINTF(("%d ",sol[i]));
         }
         PRINTF(("\n"));
       eval=eval_sol(sol,N,comm,arch);
       if(eval<best_eval){
         best_eval=eval;
         for(i=0;i<N;i++)
           Value[i]=sol[i];
       }


     }while(max>0);

     sol=generate_random_sol(N,0,seed++);

   }

   if (NULL != gain){
        for (i =0; i< N; i++){
            if (gain[i] != NULL){
                free(gain[i]);
            }
        }
        free(gain);
    }
    if (NULL != history){
        for (i =0; i< N; i++){
            if (history[i] != NULL){
                free(history[i]);
            }
        }
        free(history);
    }


 }