diff options
Diffstat (limited to 'audio/filter/af_surround.c')
-rw-r--r-- | audio/filter/af_surround.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/audio/filter/af_surround.c b/audio/filter/af_surround.c index 7e04a79ed8..eabf1474bd 100644 --- a/audio/filter/af_surround.c +++ b/audio/filter/af_surround.c @@ -141,21 +141,27 @@ static const float steering_matrix[][12] = { // Experimental moving average dominance //static int amp_L = 0, amp_R = 0, amp_C = 0, amp_S = 0; -// Filter data through filter -static int filter(struct af_instance* af, struct mp_audio* data, int flags){ +static int filter_frame(struct af_instance *af, struct mp_audio *data) +{ + if (!data) + return 0; + struct mp_audio *outframe = + mp_audio_pool_get(af->out_pool, &af->fmt_out, data->samples); + if (!outframe) { + talloc_free(data); + return -1; + } + mp_audio_copy_attributes(outframe, data); + af_surround_t* s = (af_surround_t*)af->priv; const float* m = steering_matrix[0]; float* in = data->planes[0]; // Input audio data - float* out = NULL; // Output audio data + float* out = outframe->planes[0]; // Output audio data float* end = in + data->samples * data->nch; int i = s->i; // Filter queue index int ri = s->ri; // Read index for delay queue int wi = s->wi; // Write index for delay queue - mp_audio_realloc_min(af->data, data->samples); - - out = af->data->planes[0]; - while(in < end){ /* Dominance: abs(in[0]) abs(in[1]); @@ -215,16 +221,14 @@ static int filter(struct af_instance* af, struct mp_audio* data, int flags){ // Save indexes s->i = i; s->ri = ri; s->wi = wi; - // Set output data - data->planes[0] = af->data->planes[0]; - mp_audio_set_channels_old(data, af->data->nch); - + talloc_free(data); + af_add_output_frame(af, outframe); return 0; } static int af_open(struct af_instance* af){ af->control=control; - af->filter=filter; + af->filter_frame = filter_frame; return AF_OK; } |