// Initialization and runtime control static int control(struct af_instance_s* af, int cmd, void* arg) { af_gate_t* s = (af_gate_t*)af->setup; switch(cmd){ case AF_CONTROL_REINIT: // Sanity check if(!arg) return AF_ERROR; af->data->rate = ((af_data_t*)arg)->rate; af->data->nch = ((af_data_t*)arg)->nch; af->data->format = AF_FORMAT_FLOAT_NE; af->data->bps = 4; // Time constant set to 0.1s // s->alpha = (1.0/0.2)/(2.0*M_PI*(float)((af_data_t*)arg)->rate); return af_test_output(af,(af_data_t*)arg); case AF_CONTROL_COMMAND_LINE:{ /* float v=-10.0; */ /* float vol[AF_NCH]; */ /* float s=0.0; */ /* float clipp[AF_NCH]; */ /* int i; */ /* sscanf((char*)arg,"%f:%f", &v, &s); */ /* for(i=0;i<AF_NCH;i++){ */ /* vol[i]=v; */ /* clipp[i]=s; */ /* } */ /* if(AF_OK != control(af,AF_CONTROL_VOLUME_SOFTCLIP | AF_CONTROL_SET, clipp)) */ /* return AF_ERROR; */ /* return control(af,AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET, vol); */ } case AF_CONTROL_GATE_ON_OFF | AF_CONTROL_SET: memcpy(s->enable,(int*)arg,AF_NCH*sizeof(int)); return AF_OK; case AF_CONTROL_GATE_ON_OFF | AF_CONTROL_GET: memcpy((int*)arg,s->enable,AF_NCH*sizeof(int)); return AF_OK; case AF_CONTROL_GATE_THRESH | AF_CONTROL_SET: return af_from_dB(AF_NCH,(float*)arg,s->tresh,20.0,-60.0,-1.0); case AF_CONTROL_GATE_THRESH | AF_CONTROL_GET: return af_to_dB(AF_NCH,s->tresh,(float*)arg,10.0); case AF_CONTROL_GATE_ATTACK | AF_CONTROL_SET: return af_from_ms(AF_NCH,(float*)arg,s->attack,af->data->rate,500.0,0.1); case AF_CONTROL_GATE_ATTACK | AF_CONTROL_GET: return af_to_ms(AF_NCH,s->attack,(float*)arg,af->data->rate); case AF_CONTROL_GATE_RELEASE | AF_CONTROL_SET: return af_from_ms(AF_NCH,(float*)arg,s->release,af->data->rate,3000.0,10.0); case AF_CONTROL_GATE_RELEASE | AF_CONTROL_GET: return af_to_ms(AF_NCH,s->release,(float*)arg,af->data->rate); case AF_CONTROL_GATE_RANGE | AF_CONTROL_SET: return af_from_dB(AF_NCH,(float*)arg,s->range,20.0,100.0,0.0); case AF_CONTROL_GATE_RANGE | AF_CONTROL_GET: return af_to_dB(AF_NCH,s->range,(float*)arg,10.0); } return AF_UNKNOWN; }
// Initialization and runtime control static int control(struct af_instance* af, int cmd, void* arg) { af_surround_t *s = af->setup; switch(cmd){ case AF_CONTROL_REINIT:{ float fc; mp_audio_copy_config(af->data, (struct mp_audio*)arg); mp_audio_set_channels_old(af->data, ((struct mp_audio*)arg)->nch*2); mp_audio_set_format(af->data, AF_FORMAT_FLOAT_NE); if (af->data->nch != 4){ mp_msg(MSGT_AFILTER, MSGL_ERR, "[surround] Only stereo input is supported.\n"); return AF_DETACH; } // Surround filer coefficients fc = 2.0 * 7000.0/(float)af->data->rate; if (-1 == af_filter_design_fir(L, s->w, &fc, LP|HAMMING, 0)){ mp_msg(MSGT_AFILTER, MSGL_ERR, "[surround] Unable to design low-pass filter.\n"); return AF_ERROR; } // Free previous delay queues free(s->dl); free(s->dr); // Allocate new delay queues s->dl = calloc(LD,af->data->bps); s->dr = calloc(LD,af->data->bps); if((NULL == s->dl) || (NULL == s->dr)) mp_msg(MSGT_AFILTER, MSGL_FATAL, "[delay] Out of memory\n"); // Initialize delay queue index if(AF_OK != af_from_ms(1, &s->d, &s->wi, af->data->rate, 0.0, 1000.0)) return AF_ERROR; // printf("%i\n",s->wi); s->ri = 0; if((af->data->format != ((struct mp_audio*)arg)->format) || (af->data->bps != ((struct mp_audio*)arg)->bps)){ mp_audio_set_format((struct mp_audio*)arg, af->data->format); return AF_FALSE; } return AF_OK; } case AF_CONTROL_COMMAND_LINE:{ float d = 0; sscanf((char*)arg,"%f",&d); if ((d < 0) || (d > 1000)){ mp_msg(MSGT_AFILTER, MSGL_ERR, "[surround] Invalid delay time, valid time values" " are 0ms to 1000ms current value is %0.3f ms\n",d); return AF_ERROR; } s->d = d; return AF_OK; } } return AF_UNKNOWN; }
// Initialization and runtime control static int control(struct af_instance* af, int cmd, void* arg) { af_delay_t* s = af->setup; switch(cmd){ case AF_CONTROL_REINIT:{ int i; // Free prevous delay queues for(i=0;i<af->data->nch;i++) free(s->q[i]); mp_audio_copy_config(af->data, (struct mp_audio*)arg); mp_audio_force_interleaved_format(af->data); // Allocate new delay queues for(i=0;i<af->data->nch;i++){ s->q[i] = calloc(L,af->data->bps); if(NULL == s->q[i]) mp_msg(MSGT_AFILTER, MSGL_FATAL, "[delay] Out of memory\n"); } if(AF_OK != af_from_ms(AF_NCH, s->d, s->wi, af->data->rate, 0.0, 1000.0)) return AF_ERROR; s->ri = 0; for(i=0;i<AF_NCH;i++){ mp_msg(MSGT_AFILTER, MSGL_DBG2, "[delay] Channel %i delayed by %0.3fms\n", i,MPCLAMP(s->d[i],0.0,1000.0)); mp_msg(MSGT_AFILTER, MSGL_DBG3, "[delay] Channel %i delayed by %i samples\n", i,s->wi[i]); } return AF_OK; } case AF_CONTROL_COMMAND_LINE:{ int n = 1; int i = 0; char* cl = arg; while(n && i < AF_NCH ){ sscanf(cl,"%f:%n",&s->d[i],&n); if(n==0 || cl[n-1] == '\0') break; cl=&cl[n]; i++; } return AF_OK; } } return AF_UNKNOWN; }
// Initialization and runtime control static int control(struct af_instance* af, int cmd, void* arg) { af_surround_t *s = af->priv; switch(cmd){ case AF_CONTROL_REINIT:{ struct mp_audio *in = arg; float fc; if (!mp_chmap_is_stereo(&in->channels)) { MP_ERR(af, "Only stereo input is supported.\n"); return AF_DETACH; } mp_audio_set_format(in, AF_FORMAT_FLOAT); mp_audio_copy_config(af->data, in); mp_audio_set_channels_old(af->data, in->nch * 2); // Surround filer coefficients fc = 2.0 * 7000.0/(float)af->data->rate; if (-1 == af_filter_design_fir(L, s->w, &fc, LP|HAMMING, 0)){ MP_ERR(af, "Unable to design low-pass filter.\n"); return AF_ERROR; } // Free previous delay queues free(s->dl); free(s->dr); // Allocate new delay queues s->dl = calloc(LD,af->data->bps); s->dr = calloc(LD,af->data->bps); if((NULL == s->dl) || (NULL == s->dr)) MP_FATAL(af, "Out of memory\n"); // Initialize delay queue index if(AF_OK != af_from_ms(1, &s->d, &s->wi, af->data->rate, 0.0, 1000.0)) return AF_ERROR; // printf("%i\n",s->wi); s->ri = 0; return AF_OK; } } return AF_UNKNOWN; }
// Initialization and runtime control static int control(struct af_instance* af, int cmd, void* arg) { af_delay_t* s = af->priv; switch(cmd){ case AF_CONTROL_REINIT:{ int i; struct mp_audio *in = arg; if (in->bps != 1 && in->bps != 2 && in->bps != 4) { mp_msg(MSGT_AFILTER, MSGL_FATAL, "[delay] Sample format not supported\n"); return AF_ERROR; } // Free prevous delay queues for(i=0;i<af->data->nch;i++) free(s->q[i]); mp_audio_force_interleaved_format(in); mp_audio_copy_config(af->data, in); // Allocate new delay queues for(i=0;i<af->data->nch;i++){ s->q[i] = calloc(L,af->data->bps); if(NULL == s->q[i]) mp_msg(MSGT_AFILTER, MSGL_FATAL, "[delay] Out of memory\n"); } if(AF_OK != af_from_ms(AF_NCH, s->d, s->wi, af->data->rate, 0.0, 1000.0)) return AF_ERROR; s->ri = 0; for(i=0;i<AF_NCH;i++){ mp_msg(MSGT_AFILTER, MSGL_DBG2, "[delay] Channel %i delayed by %0.3fms\n", i,MPCLAMP(s->d[i],0.0,1000.0)); mp_msg(MSGT_AFILTER, MSGL_DBG3, "[delay] Channel %i delayed by %i samples\n", i,s->wi[i]); } return AF_OK; } } return AF_UNKNOWN; }
// Initialization and runtime control static int control(struct af_instance_s* af, int cmd, void* arg) { af_delay_t* s = af->setup; switch(cmd){ case AF_CONTROL_REINIT:{ int i; // Free prevous delay queues for(i=0;i<af->data->nch;i++){ if(s->q[i]) free(s->q[i]); } af->data->rate = ((af_data_t*)arg)->rate; af->data->nch = ((af_data_t*)arg)->nch; af->data->format = ((af_data_t*)arg)->format; af->data->bps = ((af_data_t*)arg)->bps; // Allocate new delay queues for(i=0;i<af->data->nch;i++){ s->q[i] = calloc(L,af->data->bps); if(NULL == s->q[i]) af_msg(AF_MSG_FATAL,"[delay] Out of memory\n"); } return control(af,AF_CONTROL_DELAY_LEN | AF_CONTROL_SET,s->d); } case AF_CONTROL_COMMAND_LINE:{ int n = 1; int i = 0; char* cl = arg; while(n && i < AF_NCH ){ sscanf(cl,"%f:%n",&s->d[i],&n); if(n==0 || cl[n-1] == '\0') break; cl=&cl[n]; i++; } return AF_OK; } case AF_CONTROL_DELAY_LEN | AF_CONTROL_SET:{ int i; if(AF_OK != af_from_ms(AF_NCH, arg, s->wi, af->data->rate, 0.0, 1000.0)) return AF_ERROR; s->ri = 0; for(i=0;i<AF_NCH;i++){ af_msg(AF_MSG_DEBUG0,"[delay] Channel %i delayed by %0.3fms\n", i,clamp(s->d[i],0.0,1000.0)); af_msg(AF_MSG_DEBUG1,"[delay] Channel %i delayed by %i samples\n", i,s->wi[i]); } return AF_OK; } case AF_CONTROL_DELAY_LEN | AF_CONTROL_GET:{ int i; for(i=0;i<AF_NCH;i++){ if(s->ri > s->wi[i]) s->wi[i] = L - (s->ri - s->wi[i]); else s->wi[i] = s->wi[i] - s->ri; } return af_to_ms(AF_NCH, s->wi, arg, af->data->rate); } } return AF_UNKNOWN; }