af: fix crash when trying to use volume controls with AC3 pass-through

Changing the volume when softvol is enabled or if the audio output driver
doesn't support volume controls causes insertion of the "volume" filter.
This fails with AC3. Since the filter wasn't removed after that, and the
filter chain was in a bogus state, random crashes occured past this
point.

Fix it by reinitializing the filter chain completely on failure. Volume
controls simply won't work. (This can't be fixed, because AC3 is a
compressed format, and would require additional decoding/encoding passes
in order to support arbitrary volume changes.)

This also affects balance controls.
This commit is contained in:
wm4 2012-01-14 09:06:16 +01:00
parent ad18a33f58
commit 7187b49148
1 changed files with 8 additions and 1 deletions

View File

@ -278,6 +278,11 @@ static void af_print_filter_chain(af_stream_t* s)
mp_msg(MSGT_AFILTER, MSGL_V, "\n");
}
// Warning:
// A failed af_reinit() leaves the audio chain behind in a useless, broken
// state (for example, format filters that were tentatively inserted stay
// inserted).
// In that case, you should always rebuild the filter chain, or abort.
int af_reinit(af_stream_t* s, af_instance_t* af)
{
do{
@ -587,7 +592,9 @@ af_instance_t* af_add(af_stream_t* s, char* name){
// Reinitalize the filter list
if(AF_OK != af_reinit(s, s->first) ||
AF_OK != fixup_output_format(s)){
free(new);
while (s->first)
af_remove(s, s->first);
af_init(s);
return NULL;
}
return new;