diff options
author | wm4 <wm4@nowhere> | 2014-10-02 01:47:27 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-10-02 02:42:23 +0200 |
commit | 7dd3822d099522cd8bf59aa1eb3e318e2cfcacdd (patch) | |
tree | 2167d50000fe2d52f23c468595c8c6b887b09a29 /audio/decode | |
parent | 2e16dfbf93bd9348c4beb526b14f52b01af3e867 (diff) | |
download | mpv-7dd3822d099522cd8bf59aa1eb3e318e2cfcacdd.tar.bz2 mpv-7dd3822d099522cd8bf59aa1eb3e318e2cfcacdd.tar.xz |
audio: refactor some aspects of filter chain setup
There's no real reason why audio_init_filter() should exist. Just use
af_init or af_reinit directly. (We lose a useless message; the same
information is printed in a quite close place with more details.)
Requires less code, and the way the filter chain is marked as having
failed to initialize allows just switching off audio instead of
crashing if trying to insert a volume filter in mixer.c fails, and
recreating the old filter chain fails too.
Diffstat (limited to 'audio/decode')
-rw-r--r-- | audio/decode/dec_audio.c | 53 | ||||
-rw-r--r-- | audio/decode/dec_audio.h | 5 |
2 files changed, 4 insertions, 54 deletions
diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index 4b8ae7949c..29674f3e0e 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -164,57 +164,13 @@ void audio_uninit(struct dec_audio *d_audio) { if (!d_audio) return; - if (d_audio->afilter) { - MP_VERBOSE(d_audio, "Uninit audio filters...\n"); - af_destroy(d_audio->afilter); - d_audio->afilter = NULL; - } + MP_VERBOSE(d_audio, "Uninit audio filters...\n"); + af_destroy(d_audio->afilter); uninit_decoder(d_audio); talloc_free(d_audio->decode_buffer); talloc_free(d_audio); } - -int audio_init_filters(struct dec_audio *d_audio, int in_samplerate, - int *out_samplerate, struct mp_chmap *out_channels, - int *out_format) -{ - if (!d_audio->afilter) - d_audio->afilter = af_new(d_audio->global); - struct af_stream *afs = d_audio->afilter; - - // input format: same as codec's output format: - mp_audio_buffer_get_format(d_audio->decode_buffer, &afs->input); - // Sample rate can be different when adjusting playback speed - afs->input.rate = in_samplerate; - - // output format: same as ao driver's input format (if missing, fallback to input) - afs->output.rate = *out_samplerate; - mp_audio_set_channels(&afs->output, out_channels); - mp_audio_set_format(&afs->output, *out_format); - - afs->replaygain_data = d_audio->replaygain_data; - - char *s_from = mp_audio_config_to_str(&afs->input); - char *s_to = mp_audio_config_to_str(&afs->output); - MP_VERBOSE(d_audio, "Building audio filter chain for %s -> %s...\n", s_from, s_to); - talloc_free(s_from); - talloc_free(s_to); - - // let's autoprobe it! - if (af_init(afs) != 0) { - af_destroy(afs); - d_audio->afilter = NULL; - return 0; // failed :( - } - - *out_samplerate = afs->output.rate; - *out_channels = afs->output.channels; - *out_format = afs->output.format; - - return 1; -} - /* Decode packets until we know the audio format. Then reinit the buffer. * Returns AD_OK on success, negative AD_* code otherwise. * Also returns AD_OK if already initialized (and does nothing). @@ -304,7 +260,7 @@ static int filter_n_bytes(struct dec_audio *da, struct mp_audio_buffer *outbuf, int audio_decode(struct dec_audio *d_audio, struct mp_audio_buffer *outbuf, int minsamples) { - if (!d_audio->afilter) + if (d_audio->afilter->initialized < 1) return AD_ERR; // Indicates that a filter seems to be buffering large amounts of data @@ -354,8 +310,7 @@ void audio_reset_decoding(struct dec_audio *d_audio) { if (d_audio->ad_driver) d_audio->ad_driver->control(d_audio, ADCTRL_RESET, NULL); - if (d_audio->afilter) - af_control_all(d_audio->afilter, AF_CONTROL_RESET, NULL); + af_control_all(d_audio->afilter, AF_CONTROL_RESET, NULL); d_audio->pts = MP_NOPTS_VALUE; d_audio->pts_offset = 0; if (d_audio->decode_buffer) diff --git a/audio/decode/dec_audio.h b/audio/decode/dec_audio.h index b76ff0b95c..08fa87e8a7 100644 --- a/audio/decode/dec_audio.h +++ b/audio/decode/dec_audio.h @@ -36,7 +36,6 @@ struct dec_audio { struct mp_audio_buffer *decode_buffer; struct af_stream *afilter; char *decoder_desc; - struct replaygain_data *replaygain_data; int init_retries; // set by decoder struct mp_audio decoded; // decoded audio set by last decode_packet() call @@ -65,8 +64,4 @@ int initial_audio_decode(struct dec_audio *d_audio); void audio_reset_decoding(struct dec_audio *d_audio); void audio_uninit(struct dec_audio *d_audio); -int audio_init_filters(struct dec_audio *d_audio, int in_samplerate, - int *out_samplerate, struct mp_chmap *out_channels, - int *out_format); - #endif /* MPLAYER_DEC_AUDIO_H */ |