diff options
Diffstat (limited to 'audio/filter')
27 files changed, 334 insertions, 558 deletions
diff --git a/audio/filter/af.c b/audio/filter/af.c index edee4bef65..63013e81d9 100644 --- a/audio/filter/af.c +++ b/audio/filter/af.c @@ -201,6 +201,7 @@ static struct af_instance *af_create(struct af_stream *s, char *name, *af = (struct af_instance) { .info = info, .mul = 1, + .data = talloc_zero(af, struct mp_audio), }; struct m_config *config = m_config_from_obj_desc(af, &desc); if (m_config_initialize_obj(config, &desc, &af->priv, &args) < 0) @@ -523,8 +524,7 @@ static int af_reinit(struct af_stream *s) // Check if this is the first filter struct mp_audio in = *af->prev->data; // Reset just in case... - in.audio = NULL; - in.len = 0; + mp_audio_set_null_data(&in); int rv = af->control(af, AF_CONTROL_REINIT, &in); if (rv == AF_OK && !mp_audio_config_equals(&in, af->prev->data)) @@ -640,8 +640,8 @@ int af_init(struct af_stream *s) return -1; // Precaution in case caller is misbehaving - s->input.audio = s->output.audio = NULL; - s->input.len = s->output.len = 0; + mp_audio_set_null_data(&s->input); + mp_audio_set_null_data(&s->output); // Check if this is the first call if (s->first->next == s->last) { @@ -703,12 +703,12 @@ struct mp_audio *af_play(struct af_stream *s, struct mp_audio *data) return data; } -// Calculate average ratio of filter output size to input size +// Calculate average ratio of filter output samples to input samples. +// e.g: num_output_samples = mul * num_input_samples double af_calc_filter_multiplier(struct af_stream *s) { struct af_instance *af = s->first; double mul = 1; - // Iterate through all filters and calculate total multiplication factor do { mul *= af->mul; af = af->next; @@ -721,49 +721,14 @@ double af_calc_filter_multiplier(struct af_stream *s) double af_calc_delay(struct af_stream *s) { struct af_instance *af = s->first; - register double delay = 0.0; - // Iterate through all filters + double delay = 0.0; while (af) { delay += af->delay; - delay *= af->mul; af = af->next; } return delay; } -/* Calculate the minimum output buffer size for given input data d - * when using the af_resize_local_buffer function. The +t+1 part ensures the - * value is >= len*mul rounded upwards to whole samples even if the - * double 'mul' is inexact. */ -static int af_lencalc(double mul, struct mp_audio *d) -{ - int t = d->bps * d->nch; - return d->len * mul + t + 1; -} - -/* I a local buffer is used (i.e. if the filter doesn't operate on the incoming - * buffer), this macro must be called to ensure the buffer is big enough. */ -int af_resize_local_buffer(struct af_instance *af, struct mp_audio *data) -{ - if (af->data->len >= af_lencalc(af->mul, data)) - return AF_OK; - - // Calculate new length - register int len = af_lencalc(af->mul, data); - mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Reallocating memory in module %s, " - "old len = %i, new len = %i\n", af->info->name, af->data->len, len); - // If there is a buffer free it - free(af->data->audio); - // Create new buffer and check that it is OK - af->data->audio = malloc(len); - if (!af->data->audio) { - mp_msg(MSGT_AFILTER, MSGL_FATAL, "[libaf] Could not allocate memory \n"); - return AF_ERROR; - } - af->data->len = len; - return AF_OK; -} - // documentation in af.h struct af_instance *af_control_any_rev(struct af_stream *s, int cmd, void *arg) { diff --git a/audio/filter/af.h b/audio/filter/af.h index 3cfdee85dd..7852fa09a6 100644 --- a/audio/filter/af.h +++ b/audio/filter/af.h @@ -61,13 +61,14 @@ struct af_instance { struct mp_audio * (*play)(struct af_instance *af, struct mp_audio *data); void *setup; // old field for priv structs void *priv; - struct mp_audio *data; // configuration for outgoing data stream + struct mp_audio *data; // configuration and buffer for outgoing data stream struct af_instance *next; struct af_instance *prev; - double delay; /* Delay caused by the filter, in units of bytes read without - * corresponding output */ + double delay; /* Delay caused by the filter, in seconds of audio consumed + * without corresponding output */ double mul; /* length multiplier: how much does this instance change - the length of the buffer. */ + * the number of samples passed though. (Ratio of input + * and output, e.g. mul=4 => 1 sample becomes 4 samples) .*/ bool auto_inserted; // inserted by af.c, such as conversion filters }; @@ -182,10 +183,6 @@ double af_calc_delay(struct af_stream *s); * \{ */ -int af_resize_local_buffer(struct af_instance *af, struct mp_audio *data); - -#define RESIZE_LOCAL_BUFFER af_resize_local_buffer - /** * \brief convert dB to gain value * \param n number of values to convert diff --git a/audio/filter/af_bs2b.c b/audio/filter/af_bs2b.c index 0e77b3e4eb..769a2b4577 100644 --- a/audio/filter/af_bs2b.c +++ b/audio/filter/af_bs2b.c @@ -42,7 +42,7 @@ static struct mp_audio *play_##name(struct af_instance *af, struct mp_audio *dat { \ /* filter is called for all pairs of samples available in the buffer */ \ bs2b_cross_feed_##name(((struct af_bs2b*)(af->priv))->filter, \ - (type*)(data->audio), data->len/data->bps/2); \ + (type*)(data->planes[0]), data->samples); \ \ return data; \ } @@ -161,7 +161,6 @@ static int control(struct af_instance *af, int cmd, void *arg) static void uninit(struct af_instance *af) { struct af_bs2b *s = af->priv; - free(af->data); if (s->filter) bs2b_close(s->filter); } @@ -172,13 +171,9 @@ static int af_open(struct af_instance *af) struct af_bs2b *s = af->priv; af->control = control; af->uninit = uninit; - af->mul = 1; - if (!(af->data = calloc(1, sizeof(struct mp_audio)))) - return AF_ERROR; // NULL means failed initialization if (!(s->filter = bs2b_open())) { - free(af->data); return AF_ERROR; } diff --git a/audio/filter/af_center.c b/audio/filter/af_center.c index 0cfdbc3b0e..ed482c7a6b 100644 --- a/audio/filter/af_center.c +++ b/audio/filter/af_center.c @@ -78,7 +78,6 @@ static int control(struct af_instance* af, int cmd, void* arg) // Deallocate memory static void uninit(struct af_instance* af) { - free(af->data); free(af->setup); } @@ -87,9 +86,9 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) { struct mp_audio* c = data; // Current working data af_center_t* s = af->setup; // Setup for this instance - float* a = c->audio; // Audio data - int len = c->len/4; // Number of samples in current audio block + float* a = c->planes[0]; // Audio data int nch = c->nch; // Number of channels + int len = c->samples*c->nch; // Number of samples in current audio block int ch = s->ch; // Channel in which to insert the center audio register int i; @@ -108,10 +107,8 @@ static int af_open(struct af_instance* af){ af->control=control; af->uninit=uninit; af->play=play; - af->mul=1; - af->data=calloc(1,sizeof(struct mp_audio)); af->setup=s=calloc(1,sizeof(af_center_t)); - if(af->data == NULL || af->setup == NULL) + if(af->setup == NULL) return AF_ERROR; // Set default values s->ch = 1; // Channel nr 2 diff --git a/audio/filter/af_channels.c b/audio/filter/af_channels.c index 27445aafe2..f77807a1af 100644 --- a/audio/filter/af_channels.c +++ b/audio/filter/af_channels.c @@ -168,7 +168,10 @@ static int control(struct af_instance* af, int cmd, void* arg) af->data->rate = ((struct mp_audio*)arg)->rate; mp_audio_set_format(af->data, ((struct mp_audio*)arg)->format); - af->mul = (double)af->data->nch / ((struct mp_audio*)arg)->nch; + mp_audio_force_interleaved_format(af->data); + int r = af_test_output(af,(struct mp_audio*)arg); + if (r != AF_OK) + return r; return check_routes(s,((struct mp_audio*)arg)->nch,af->data->nch); case AF_CONTROL_COMMAND_LINE:{ int nch = 0; @@ -218,9 +221,6 @@ static int control(struct af_instance* af, int cmd, void* arg) static void uninit(struct af_instance* af) { free(af->setup); - if (af->data) - free(af->data->audio); - free(af->data); } // Filter data through filter @@ -231,20 +231,19 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) af_channels_t* s = af->setup; int i; - if(AF_OK != RESIZE_LOCAL_BUFFER(af,data)) - return NULL; + mp_audio_realloc_min(af->data, data->samples); // Reset unused channels - memset(l->audio,0,c->len / c->nch * l->nch); + memset(l->planes[0],0,mp_audio_psize(c) / c->nch * l->nch); if(AF_OK == check_routes(s,c->nch,l->nch)) for(i=0;i<s->nr;i++) - copy(c->audio,l->audio,c->nch,s->route[i][FR], - l->nch,s->route[i][TO],c->len,c->bps); + copy(c->planes[0],l->planes[0],c->nch,s->route[i][FR], + l->nch,s->route[i][TO],mp_audio_psize(c),c->bps); // Set output data - c->audio = l->audio; - c->len = c->len / c->nch * l->nch; + c->planes[0] = l->planes[0]; + c->samples = c->samples / c->nch * l->nch; mp_audio_set_channels(c, &l->channels); return c; @@ -255,10 +254,8 @@ static int af_open(struct af_instance* af){ af->control=control; af->uninit=uninit; af->play=play; - af->mul=1; - af->data=calloc(1,sizeof(struct mp_audio)); af->setup=calloc(1,sizeof(af_channels_t)); - if((af->data == NULL) || (af->setup == NULL)) + if(af->setup == NULL) return AF_ERROR; return AF_OK; } diff --git a/audio/filter/af_convert24.c b/audio/filter/af_convert24.c index 18ce156467..ee8aff5afc 100644 --- a/audio/filter/af_convert24.c +++ b/audio/filter/af_convert24.c @@ -53,8 +53,6 @@ static int control(struct af_instance *af, int cmd, void *arg) assert(test_conversion(in->format, out->format)); - af->mul = (double)out->bps / in->bps; - return mp_audio_config_equals(in, &orig_in) ? AF_OK : AF_FALSE; } case AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET: { @@ -74,16 +72,15 @@ static int control(struct af_instance *af, int cmd, void *arg) static struct mp_audio *play(struct af_instance *af, struct mp_audio *data) { - if (RESIZE_LOCAL_BUFFER(af, data) != AF_OK) - return NULL; + mp_audio_realloc_min(af->data, data->samples); struct mp_audio *out = af->data; - size_t len = data->len / data->bps; + size_t len = mp_audio_psize(data) / data->bps; if (data->bps == 4) { for (int s = 0; s < len; s++) { - uint32_t val = *((uint32_t *)data->audio + s); - uint8_t *ptr = (uint8_t *)out->audio + s * 3; + uint32_t val = *((uint32_t *)data->planes[0] + s); + uint8_t *ptr = (uint8_t *)out->planes[0] + s * 3; ptr[0] = val >> SHIFT(0); ptr[1] = val >> SHIFT(1); ptr[2] = val >> SHIFT(2); @@ -91,32 +88,23 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data) mp_audio_set_format(data, af_fmt_change_bits(data->format, 24)); } else { for (int s = 0; s < len; s++) { - uint8_t *ptr = (uint8_t *)data->audio + s * 3; + uint8_t *ptr = (uint8_t *)data->planes[0] + s * 3; uint32_t val = ptr[0] << SHIFT(0) | ptr[1] << SHIFT(1) | ptr[2] << SHIFT(2); - *((uint32_t *)out->audio + s) = val; + *((uint32_t *)out->planes[0] + s) = val; } mp_audio_set_format(data, af_fmt_change_bits(data->format, 32)); } - data->audio = out->audio; - data->len = len * data->bps; + data->planes[0] = out->planes[0]; return data; } -static void uninit(struct af_instance* af) -{ - if (af->data) - free(af->data->audio); -} - static int af_open(struct af_instance *af) { af->control = control; af->play = play; - af->uninit = uninit; - af->data = talloc_zero(af, struct mp_audio); return AF_OK; } diff --git a/audio/filter/af_convertsignendian.c b/audio/filter/af_convertsignendian.c index bfea004bb2..65fffdf487 100644 --- a/audio/filter/af_convertsignendian.c +++ b/audio/filter/af_convertsignendian.c @@ -24,6 +24,9 @@ static bool test_conversion(int src_format, int dst_format) { + if ((src_format & AF_FORMAT_PLANAR) || + (dst_format & AF_FORMAT_PLANAR)) + return false; int src_noend = src_format & ~AF_FORMAT_END_MASK; int dst_noend = dst_format & ~AF_FORMAT_END_MASK; // We can swap endian for all formats, but sign only for integer formats. @@ -100,13 +103,13 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data) { int infmt = data->format; int outfmt = af->data->format; - size_t len = data->len / data->bps; + size_t len = data->samples * data->nch; if ((infmt & AF_FORMAT_END_MASK) != (outfmt & AF_FORMAT_END_MASK)) - endian(data->audio, len, data->bps); + endian(data->planes[0], len, data->bps); if ((infmt & AF_FORMAT_SIGN_MASK) != (outfmt & AF_FORMAT_SIGN_MASK)) - si2us(data->audio, len, data->bps, + si2us(data->planes[0], len, data->bps, (outfmt & AF_FORMAT_END_MASK) == AF_FORMAT_LE); mp_audio_set_format(data, outfmt); @@ -117,8 +120,6 @@ static int af_open(struct af_instance *af) { af->control = control; af->play = play; - af->mul = 1; - af->data = talloc_zero(af, struct mp_audio); return AF_OK; } diff --git a/audio/filter/af_delay.c b/audio/filter/af_delay.c index a6515f84cf..e2ef57221d 100644 --- a/audio/filter/af_delay.c +++ b/audio/filter/af_delay.c @@ -56,6 +56,7 @@ static int control(struct af_instance* af, int cmd, void* arg) 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++){ @@ -111,7 +112,6 @@ static void uninit(struct af_instance* af) { int i; - free(af->data); for(i=0;i<AF_NCH;i++) free(((af_delay_t*)(af->setup))->q[i]); free(af->setup); @@ -123,13 +123,13 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) struct mp_audio* c = data; // Current working data af_delay_t* s = af->setup; // Setup for this instance int nch = c->nch; // Number of channels - int len = c->len/c->bps; // Number of sample in data chunk + int len = mp_audio_psize(c)/c->bps; // Number of sample in data chunk int ri = 0; int ch,i; for(ch=0;ch<nch;ch++){ switch(c->bps){ case 1:{ - int8_t* a = c->audio; + int8_t* a = c->planes[0]; int8_t* q = s->q[ch]; int wi = s->wi[ch]; ri = s->ri; @@ -143,7 +143,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) break; } case 2:{ - int16_t* a = c->audio; + int16_t* a = c->planes[0]; int16_t* q = s->q[ch]; int wi = s->wi[ch]; ri = s->ri; @@ -157,7 +157,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) break; } case 4:{ - int32_t* a = c->audio; + int32_t* a = c->planes[0]; int32_t* q = s->q[ch]; int wi = s->wi[ch]; ri = s->ri; @@ -181,10 +181,8 @@ static int af_open(struct af_instance* af){ af->control=control; af->uninit=uninit; af->play=play; - af->mul=1; - af->data=calloc(1,sizeof(struct mp_audio)); af->setup=calloc(1,sizeof(af_delay_t)); - if(af->data == NULL || af->setup == NULL) + if(af->setup == NULL) return AF_ERROR; return AF_OK; } diff --git a/audio/filter/af_drc.c b/audio/filter/af_drc.c index 9bbbde4831..17c4a12a95 100644 --- a/audio/filter/af_drc.c +++ b/audio/filter/af_drc.c @@ -88,6 +88,7 @@ static int control(struct af_instance* af, int cmd, void* arg) // Sanity check if(!arg) return AF_ERROR; + mp_audio_force_interleaved_format((struct mp_audio*)arg); mp_audio_copy_config(af->data, (struct mp_audio*)arg); if(((struct mp_audio*)arg)->format != (AF_FORMAT_S16_NE)){ @@ -112,15 +113,14 @@ static int control(struct af_instance* af, int cmd, void* arg) // Deallocate memory static void uninit(struct af_instance* af) { - free(af->data); free(af->setup); } static void method1_int16(af_drc_t *s, struct mp_audio *c) { register int i = 0; - int16_t *data = (int16_t*)c->audio; // Audio data - int len = c->len/2; // Number of samples + int16_t *data = (int16_t*)c->planes[0]; // Audio data + int len = c->samples*c->nch; // Number of samples float curavg = 0.0, newavg, neededmul; int tmp; @@ -161,8 +161,8 @@ static void method1_int16(af_drc_t *s, struct mp_audio *c) static void method1_float(af_drc_t *s, struct mp_audio *c) { register int i = 0; - float *data = (float*)c->audio; // Audio data - int len = c->len/4; // Number of samples + float *data = (float*)c->planes[0]; // Audio data + int len = c->samples*c->nch; // Number of samples float curavg = 0.0, newavg, neededmul, tmp; for (i = 0; i < len; i++) @@ -198,8 +198,8 @@ static void method1_float(af_drc_t *s, struct mp_audio *c) static void method2_int16(af_drc_t *s, struct mp_audio *c) { register int i = 0; - int16_t *data = (int16_t*)c->audio; // Audio data - int len = c->len/2; // Number of samples + int16_t *data = (int16_t*)c->planes[0]; // Audio data + int len = c->samples*c->nch; // Number of samples float curavg = 0.0, newavg, avg = 0.0; int tmp, totallen = 0; @@ -248,8 +248,8 @@ static void method2_int16(af_drc_t *s, struct mp_audio *c) static void method2_float(af_drc_t *s, struct mp_audio *c) { register int i = 0; - float *data = (float*)c->audio; // Audio data - int len = c->len/4; // Number of samples + float *data = (float*)c->planes[0]; // Audio data + int len = c->samples*c->nch; // Number of samples float curavg = 0.0, newavg, avg = 0.0, tmp; int totallen = 0; @@ -319,10 +319,8 @@ static int af_open(struct af_instance* af){ af->control=control; af->uninit=uninit; af->play=play; - af->mul=1; - af->data=calloc(1,sizeof(struct mp_audio)); af->setup=calloc(1,sizeof(af_drc_t)); - if(af->data == NULL || af->setup == NULL) + if(af->setup == NULL) return AF_ERROR; ((af_drc_t*)af->setup)->mul = MUL_INIT; diff --git a/audio/filter/af_dummy.c b/audio/filter/af_dummy.c index ab601ba9bb..d1cb054413 100644 --- a/audio/filter/af_dummy.c +++ b/audio/filter/af_dummy.c @@ -40,12 +40,6 @@ static int control(struct af_instance* af, int cmd, void* arg) return AF_UNKNOWN; } -// Deallocate memory -static void uninit(struct af_instance* af) -{ - free(af->data); -} - // Filter data through filter static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) { @@ -58,12 +52,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) // Allocate memory and set function pointers static int af_open(struct af_instance* af){ af->control=control; - af->uninit=uninit; af->play=play; - af->mul=1; - af->data=malloc(sizeof(struct mp_audio)); - if(af->data == NULL) - return AF_ERROR; return AF_OK; } diff --git a/audio/filter/af_equalizer.c b/audio/filter/af_equalizer.c index cbdcd3f84a..75a489d867 100644 --- a/audio/filter/af_equalizer.c +++ b/audio/filter/af_equalizer.c @@ -114,7 +114,7 @@ static int control(struct af_instance* af, int cmd, void* arg) bp2(s->a[k],s->b[k],F[k]/((float)af->data->rate),Q); // Calculate how much this plugin adds to the overall time delay - af->delay = 2 * af->data->nch * af->data->bps; + af->delay = 2.0 / (double)af->data->rate; // Calculate gain factor to prevent clipping at output for(k=0;k<AF_NCH;k++) @@ -156,7 +156,6 @@ static int control(struct af_instance* af, int cmd, void* arg) // Deallocate memory static void uninit(struct af_instance* af) { - free(af->data); free(af->setup); } @@ -170,9 +169,9 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) while(ci--){ float* g = s->g[ci]; // Gain factor - float* in = ((float*)c->audio)+ci; - float* out = ((float*)c->audio)+ci; - float* end = in + c->len/4; // Block loop end + float* in = ((float*)c->planes[0])+ci; + float* out = ((float*)c->planes[0])+ci; + float* end = in + c->samples*c->nch; // Block loop end while(in < end){ register int k = 0; // Frequency band index @@ -204,10 +203,8 @@ static int af_open(struct af_instance* af){ af->control=control; af->uninit=uninit; af->play=play; - af->mul=1; - af->data=calloc(1,sizeof(struct mp_audio)); af->setup=calloc(1,sizeof(af_equalizer_t)); - if(af->data == NULL || af->setup == NULL) + if(af->setup == NULL) return AF_ERROR; return AF_OK; } diff --git a/audio/filter/af_export.c b/audio/filter/af_export.c index 45143075a1..5e1096f85a 100644 --- a/audio/filter/af_export.c +++ b/audio/filter/af_export.c @@ -183,9 +183,6 @@ static int control(struct af_instance* af, int cmd, void* arg) */ static void uninit( struct af_instance* af ) { - free(af->data); - af->data = NULL; - if(af->setup){ af_export_t* s = af->setup; if (s->buf) @@ -213,9 +210,9 @@ static struct mp_audio* play( struct af_instance* af, struct mp_audio* data ) { struct mp_audio* c = data; // Current working data af_export_t* s = af->setup; // Setup for this instance - int16_t* a = c->audio; // Incomming sound + int16_t* a = c->planes[0]; // Incomming sound int nch = c->nch; // Number of channels - int len = c->len/c->bps; // Number of sample in data chunk + int len = c->samples*c->nch; // Number of sample in data chunk int sz = s->sz; // buffer size (in samples) int flag = 0; // Set to 1 if buffer is filled @@ -259,10 +256,8 @@ static int af_open( struct af_instance* af ) af->control = control; af->uninit = uninit; af->play = play; - af->mul=1; - af->data = calloc(1, sizeof(struct mp_audio)); af->setup = calloc(1, sizeof(af_export_t)); - if((af->data == NULL) || (af->setup == NULL)) + if(af->setup == NULL) return AF_ERROR; ((af_export_t *)af->setup)->filename = mp_find_user_config_file(SHARED_FILE); diff --git a/audio/filter/af_extrastereo.c b/audio/filter/af_extrastereo.c index 4cf27f2724..4561b60690 100644 --- a/audio/filter/af_extrastereo.c +++ b/audio/filter/af_extrastereo.c @@ -49,6 +49,7 @@ static int control(struct af_instance* af, int cmd, void* arg) if(!arg) return AF_ERROR; mp_audio_copy_config(af->data, (struct mp_audio*)arg); + mp_audio_force_interleaved_format(af->data); mp_audio_set_num_channels(af->data, 2); if (af->data->format == AF_FORMAT_FLOAT_NE) { @@ -74,7 +75,6 @@ static int control(struct af_instance* af, int cmd, void* arg) // Deallocate memory static void uninit(struct af_instance* af) { - free(af->data); free(af->setup); } @@ -83,8 +83,8 @@ static struct mp_audio* play_s16(struct af_instance* af, struct mp_audio* data) { af_extrastereo_t *s = af->setup; register int i = 0; - int16_t *a = (int16_t*)data->audio; // Audio data - int len = data->len/2; // Number of samples + int16_t *a = (int16_t*)data->planes[0]; // Audio data + int len = data->samples*data->nch; // Number of samples int avg, l, r; for (i = 0; i < len; i+=2) @@ -105,8 +105,8 @@ static struct mp_audio* play_float(struct af_instance* af, struct mp_audio* data { af_extrastereo_t *s = af->setup; register int i = 0; - float *a = (float*)data->audio; // Audio data - int len = data->len/4; // Number of samples + float *a = (float*)data->planes[0]; // Audio data + int len = data->samples * data->nch; // Number of samples float avg, l, r; for (i = 0; i < len; i+=2) @@ -128,10 +128,8 @@ static int af_open(struct af_instance* af){ af->control=control; af->uninit=uninit; af->play=play_s16; - af->mul=1; - af->data=calloc(1,sizeof(struct mp_audio)); af->setup=calloc(1,sizeof(af_extrastereo_t)); - if(af->data == NULL || af->setup == NULL) + if(af->setup == NULL) return AF_ERROR; ((af_extrastereo_t*)af->setup)->mul = 2.5; diff --git a/audio/filter/af_format.c b/audio/filter/af_format.c index 642ef927bb..5b941951cb 100644 --- a/audio/filter/af_format.c +++ b/audio/filter/af_format.c @@ -35,9 +35,6 @@ struct priv { struct mp_chmap out_channels; int fail; - - struct mp_audio data; - struct mp_audio temp; }; static void force_in_params(struct af_instance *af, struct mp_audio *in) @@ -101,23 +98,14 @@ static int control(struct af_instance *af, int cmd, void *arg) static struct mp_audio *play(struct af_instance *af, struct mp_audio *data) { - struct priv *priv = af->priv; - struct mp_audio *r = &priv->temp; - - *r = *af->data; - r->audio = data->audio; - r->len = data->len; - - return r; + mp_audio_copy_config(data, af->data); + return data; } static int af_open(struct af_instance *af) { af->control = control; af->play = play; - af->mul = 1; - struct priv *priv = af->priv; - af->data = &priv->data; force_in_params(af, af->data); force_out_params(af, af->data); diff --git a/audio/filter/af_hrtf.c b/audio/filter/af_hrtf.c index 5b80bf0eec..ed51351750 100644 --- a/audio/filter/af_hrtf.c +++ b/audio/filter/af_hrtf.c @@ -313,7 +313,6 @@ static int control(struct af_instance *af, int cmd, void* arg) mp_audio_set_channels_old(af->data, 5); mp_audio_set_format(af->data, AF_FORMAT_S16_NE); test_output_res = af_test_output(af, (struct mp_audio*)arg); - af->mul = 2.0 / af->data->nch; // after testing input set the real output format mp_audio_set_num_channels(af->data, 2); s->print_flag = 1; @@ -366,9 +365,6 @@ static void uninit(struct af_instance *af) free(s->fwrbuf_rr); free(af->setup); } - if(af->data) - free(af->data->audio); - free(af->data); } /* Filter data through filter @@ -385,14 +381,13 @@ damped (without any real 3D acoustical image, however). static struct mp_audio* play(struct af_instance *af, struct mp_audio *data) { af_hrtf_t *s = af->setup; - short *in = data->audio; // Input audio data + short *in = data->planes[0]; // Input audio data short *out = NULL; // Output audio data - short *end = in + data->len / sizeof(short); // Loop end + short *end = in + data->samples * data->nch; // Loop end float common, left, right, diff, left_b, right_b; const int dblen = s->dlbuflen, hlen = s->hrflen, blen = s->basslen; - if(AF_OK != RESIZE_LOCAL_BUFFER(af, data)) |