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); } }
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; }
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; }
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); }
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); } }