summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-10-02 01:47:27 +0200
committerwm4 <wm4@nowhere>2014-10-02 02:42:23 +0200
commit7dd3822d099522cd8bf59aa1eb3e318e2cfcacdd (patch)
tree2167d50000fe2d52f23c468595c8c6b887b09a29 /player
parent2e16dfbf93bd9348c4beb526b14f52b01af3e867 (diff)
downloadmpv-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 'player')
-rw-r--r--player/audio.c74
1 files changed, 37 insertions, 37 deletions
diff --git a/player/audio.c b/player/audio.c
index cc4496ed57..85dda4722c 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -45,34 +45,30 @@
static int recreate_audio_filters(struct MPContext *mpctx)
{
- struct dec_audio *d_audio = mpctx->d_audio;
- struct MPOpts *opts = mpctx->opts;
+ assert(mpctx->d_audio);
- assert(d_audio);
+ struct af_stream *afs = mpctx->d_audio->afilter;
+ struct MPOpts *opts = mpctx->opts;
struct mp_audio in_format;
- mp_audio_buffer_get_format(d_audio->decode_buffer, &in_format);
-
- struct mp_audio out_format;
- ao_get_format(mpctx->ao, &out_format);
+ mp_audio_buffer_get_format(mpctx->d_audio->decode_buffer, &in_format);
+ int new_srate = in_format.rate;
- int new_srate;
- if (af_control_any_rev(d_audio->afilter, AF_CONTROL_SET_PLAYBACK_SPEED,
- &opts->playback_speed))
- new_srate = in_format.rate;
- else {
+ if (!af_control_any_rev(afs, AF_CONTROL_SET_PLAYBACK_SPEED,
+ &opts->playback_speed))
+ {
new_srate = in_format.rate * opts->playback_speed;
- if (new_srate != out_format.rate)
+ if (new_srate != afs->output.rate)
opts->playback_speed = new_srate / (double)in_format.rate;
}
- if (!audio_init_filters(d_audio, new_srate,
- &out_format.rate, &out_format.channels, &out_format.format))
- {
+ afs->input.rate = new_srate;
+
+ if (af_init(afs) < 0) {
MP_ERR(mpctx, "Couldn't find matching filter/ao format!\n");
return -1;
}
- mixer_reinit_audio(mpctx->mixer, mpctx->ao, mpctx->d_audio->afilter);
+ mixer_reinit_audio(mpctx->mixer, mpctx->ao, afs);
return 0;
}
@@ -121,7 +117,8 @@ void reinit_audio_chain(struct MPContext *mpctx)
mpctx->d_audio->global = mpctx->global;
mpctx->d_audio->opts = opts;
mpctx->d_audio->header = sh;
- mpctx->d_audio->replaygain_data = sh->audio->replaygain_data;
+ mpctx->d_audio->afilter = af_new(mpctx->global);
+ mpctx->d_audio->afilter->replaygain_data = sh->audio->replaygain_data;
mpctx->ao_buffer = mp_audio_buffer_create(NULL);
if (!audio_init_best_codec(mpctx->d_audio, opts->audio_decoders))
goto init_error;
@@ -152,39 +149,41 @@ void reinit_audio_chain(struct MPContext *mpctx)
uninit_player(mpctx, INITIALIZED_AO);
}
- int ao_srate = opts->force_srate;
- int ao_format = opts->audio_output_format;
- struct mp_chmap ao_channels = {0};
+ struct af_stream *afs = mpctx->d_audio->afilter;
+
if (mpctx->initialized_flags & INITIALIZED_AO) {
- struct mp_audio out_format;
- ao_get_format(mpctx->ao, &out_format);
- ao_srate = out_format.rate;
- ao_format = out_format.format;
- ao_channels = out_format.channels;
+ ao_get_format(mpctx->ao, &afs->output);
} else {
+ afs->output = (struct mp_audio){0};
+ afs->output.rate = opts->force_srate;
+ mp_audio_set_format(&afs->output, opts->audio_output_format);
+ // automatic downmix
if (!AF_FORMAT_IS_SPECIAL(in_format.format))
- ao_channels = opts->audio_output_channels; // automatic downmix
+ mp_audio_set_channels(&afs->output, &opts->audio_output_channels);
}
+ // filter input format: same as codec's output format:
+ mp_audio_buffer_get_format(mpctx->d_audio->decode_buffer, &afs->input);
+
// Determine what the filter chain outputs. recreate_audio_filters() also
// needs this for testing whether playback speed is changed by resampling
// or using a special filter.
- if (!audio_init_filters(mpctx->d_audio, // preliminary init
- // input:
- in_format.rate,
- // output:
- &ao_srate, &ao_channels, &ao_format)) {
+ if (af_init(afs) < 0) {
MP_ERR(mpctx, "Error at audio filter chain pre-init!\n");
goto init_error;
}
if (!(mpctx->initialized_flags & INITIALIZED_AO)) {
mpctx->initialized_flags |= INITIALIZED_AO;
- mp_chmap_remove_useless_channels(&ao_channels,
+ afs->initialized = 0; // do it again
+
+ mp_chmap_remove_useless_channels(&afs->output.channels,
&opts->audio_output_channels);
+ mp_audio_set_channels(&afs->output, &afs->output.channels);
+
mpctx->ao = ao_init_best(mpctx->global, mpctx->input,
- mpctx->encode_lavc_ctx, ao_srate, ao_format,
- ao_channels);
+ mpctx->encode_lavc_ctx, afs->output.rate,
+ afs->output.format, afs->output.channels);
struct ao *ao = mpctx->ao;
if (!ao) {
MP_ERR(mpctx, "Could not open/initialize audio device -> no sound.\n");
@@ -195,6 +194,7 @@ void reinit_audio_chain(struct MPContext *mpctx)
ao_get_format(ao, &fmt);
mp_audio_buffer_reinit(mpctx->ao_buffer, &fmt);
+ afs->output = fmt;
mpctx->ao_decoder_fmt = talloc(NULL, struct mp_audio);
*mpctx->ao_decoder_fmt = in_format;
@@ -229,7 +229,7 @@ double written_audio_pts(struct MPContext *mpctx)
struct mp_audio in_format;
mp_audio_buffer_get_format(d_audio->decode_buffer, &in_format);
- if (!mp_audio_config_valid(&in_format) || !d_audio->afilter)
+ if (!mp_audio_config_valid(&in_format) || d_audio->afilter->initialized < 1)
return MP_NOPTS_VALUE;
// first calculate the end pts of audio that has been output by decoder
@@ -365,7 +365,7 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts)
if (!d_audio)
return;
- if (!d_audio->afilter || !mpctx->ao) {
+ if (d_audio->afilter->initialized < 1 || !mpctx->ao) {
// Probe the initial audio format. Returns AD_OK (and does nothing) if
// the format is already known.
int r = initial_audio_decode(mpctx->d_audio);