diff options
Diffstat (limited to 'audio/filter/af_format.c')
-rw-r--r-- | audio/filter/af_format.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/audio/filter/af_format.c b/audio/filter/af_format.c index 37d29c1f80..616bc9e494 100644 --- a/audio/filter/af_format.c +++ b/audio/filter/af_format.c @@ -75,6 +75,14 @@ static int check_format(int format) return AF_ERROR; } +static bool test_conversion(int src_format, int dst_format) +{ + // This is the fallback conversion filter, so this filter is always + // inserted on format mismatches if no other filter can handle it. + // Initializing the filter might still fail. + return true; +} + // Initialization and runtime control static int control(struct af_instance* af, int cmd, void* arg) { @@ -86,8 +94,7 @@ static int control(struct af_instance* af, int cmd, void* arg) int supported_ac3 = 0; // Make sure this filter isn't redundant - if(af->data->format == data->format && - af->data->bps == data->bps) + if(af->data->format == data->format) return AF_DETACH; // A bit complex because we can convert AC3 @@ -113,7 +120,7 @@ static int control(struct af_instance* af, int cmd, void* arg) buf1, buf2); af->data->rate = data->rate; - af->data->nch = data->nch; + mp_audio_set_channels(af->data, &data->channels); af->mul = (double)af->data->bps / data->bps; af->play = play; // set default @@ -147,7 +154,7 @@ static int control(struct af_instance* af, int cmd, void* arg) mp_msg(MSGT_AFILTER, MSGL_ERR, "[format] %s is not a valid format\n", (char *)arg); return AF_ERROR; } - if(AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET,&format)) + if(AF_OK != af->control(af, AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET,&format)) return AF_ERROR; return AF_OK; } @@ -156,8 +163,7 @@ static int control(struct af_instance* af, int cmd, void* arg) if(!AF_FORMAT_IS_AC3(*(int*)arg) && AF_OK != check_format(*(int*)arg)) return AF_ERROR; - af->data->format = *(int*)arg; - af->data->bps = af_fmt2bits(af->data->format)/8; + mp_audio_set_format(af->data, *(int*)arg); return AF_OK; } @@ -186,7 +192,7 @@ static struct mp_audio* play_swapendian(struct af_instance* af, struct mp_audio* endian(c->audio,l->audio,len,c->bps); c->audio = l->audio; - c->format = l->format; + mp_audio_set_format(c, l->format); return c; } @@ -203,9 +209,8 @@ static struct mp_audio* play_float_s16(struct af_instance* af, struct mp_audio* float2int(c->audio, l->audio, len, 2); c->audio = l->audio; + mp_audio_set_format(c, l->format); c->len = len*2; - c->bps = 2; - c->format = l->format; return c; } @@ -222,9 +227,8 @@ static struct mp_audio* play_s16_float(struct af_instance* af, struct mp_audio* int2float(c->audio, l->audio, len, 2); c->audio = l->audio; + mp_audio_set_format(c, l->format); c->len = len*4; - c->bps = 4; - c->format = l->format; return c; } @@ -276,9 +280,8 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data) // Set output data c->audio = l->audio; + mp_audio_set_format(c, l->format); c->len = len*l->bps; - c->bps = l->bps; - c->format = l->format; return c; } @@ -301,7 +304,8 @@ struct af_info af_info_format = { "Anders", "", AF_FLAGS_REENTRANT, - af_open + af_open, + .test_conversion = test_conversion, }; static inline uint32_t load24bit(void* data, int pos) { |