diff options
Diffstat (limited to 'player')
-rw-r--r-- | player/audio.c | 72 | ||||
-rw-r--r-- | player/command.c | 35 | ||||
-rw-r--r-- | player/core.h | 10 | ||||
-rw-r--r-- | player/loadfile.c | 1 | ||||
-rw-r--r-- | player/main.c | 2 | ||||
-rw-r--r-- | player/playloop.c | 1 |
6 files changed, 88 insertions, 33 deletions
diff --git a/player/audio.c b/player/audio.c index b61e464090..6c53bdf721 100644 --- a/player/audio.c +++ b/player/audio.c @@ -31,7 +31,6 @@ #include "common/common.h" #include "osdep/timer.h" -#include "audio/mixer.h" #include "audio/audio.h" #include "audio/audio_buffer.h" #include "audio/decode/dec_audio.h" @@ -120,6 +119,69 @@ fail: mp_notify(mpctx, MP_EVENT_CHANGE_ALL, NULL); } +// Called when opts->softvol_volume or opts->softvol_mute were changed. +void audio_update_volume(struct MPContext *mpctx) +{ + struct MPOpts *opts = mpctx->opts; + struct ao_chain *ao_c = mpctx->ao_chain; + if (!ao_c || ao_c->af->initialized < 1) + return; + + float gain = MPMAX(opts->softvol_volume / 100.0, 0); + if (opts->softvol_mute == 1) + gain = 0.0; + + if (!af_control_any_rev(ao_c->af, AF_CONTROL_SET_VOLUME, &gain)) { + if (gain == 1.0) + return; + MP_VERBOSE(mpctx, "Inserting volume filter.\n"); + if (!(af_add(ao_c->af, "volume", "softvol", NULL) + && af_control_any_rev(ao_c->af, AF_CONTROL_SET_VOLUME, &gain))) + MP_ERR(mpctx, "No volume control available.\n"); + } +} + +/* NOTE: Currently the balance code is seriously buggy: it always changes + * the af_pan mapping between the first two input channels and first two + * output channels to particular values. These values make sense for an + * af_pan instance that was automatically inserted for balance control + * only and is otherwise an identity transform, but if the filter was + * there for another reason, then ignoring and overriding the original + * values is completely wrong. + */ +void audio_update_balance(struct MPContext *mpctx) +{ + struct MPOpts *opts = mpctx->opts; + struct ao_chain *ao_c = mpctx->ao_chain; + if (!ao_c || ao_c->af->initialized < 1) + return; + + float val = opts->balance; + + if (af_control_any_rev(ao_c->af, AF_CONTROL_SET_PAN_BALANCE, &val)) + return; + + if (val == 0) + return; + + struct af_instance *af_pan_balance; + if (!(af_pan_balance = af_add(ao_c->af, "pan", "autopan", NULL))) { + MP_ERR(mpctx, "No balance control available.\n"); + return; + } + + /* make all other channels pass through since by default pan blocks all */ + for (int i = 2; i < AF_NCH; i++) { + float level[AF_NCH] = {0}; + level[i] = 1.f; + af_control_ext_t arg_ext = { .ch = i, .arg = level }; + af_pan_balance->control(af_pan_balance, AF_CONTROL_SET_PAN_LEVEL, + &arg_ext); + } + + af_pan_balance->control(af_pan_balance, AF_CONTROL_SET_PAN_BALANCE, &val); +} + static int recreate_audio_filters(struct MPContext *mpctx) { assert(mpctx->ao_chain); @@ -132,7 +194,11 @@ static int recreate_audio_filters(struct MPContext *mpctx) if (afs->initialized < 1 && af_init(afs) < 0) goto fail; - mixer_reinit_audio(mpctx->mixer, afs); + if (mpctx->opts->softvol == SOFTVOL_NO) + MP_ERR(mpctx, "--softvol=no is not supported anymore.\n"); + + audio_update_volume(mpctx); + audio_update_balance(mpctx); mp_notify(mpctx, MPV_EVENT_AUDIO_RECONFIG, NULL); @@ -210,7 +276,6 @@ void uninit_audio_out(struct MPContext *mpctx) // Note: with gapless_audio, stop_play is not correctly set if (mpctx->opts->gapless_audio || mpctx->stop_play == AT_END_OF_FILE) ao_drain(mpctx->ao); - mixer_uninit_audio(mpctx->mixer); ao_uninit(mpctx->ao); mp_notify(mpctx, MPV_EVENT_AUDIO_RECONFIG, NULL); @@ -243,7 +308,6 @@ static void ao_chain_uninit(struct ao_chain *ao_c) void uninit_audio_chain(struct MPContext *mpctx) { if (mpctx->ao_chain) { - mixer_uninit_audio(mpctx->mixer); ao_chain_uninit(mpctx->ao_chain); mpctx->ao_chain = NULL; diff --git a/player/command.c b/player/command.c index a815ae8a1d..d8f4f83529 100644 --- a/player/command.c +++ b/player/command.c @@ -54,7 +54,6 @@ #include "video/decode/vd.h" #include "video/out/vo.h" #include "video/csputils.h" -#include "audio/mixer.h" #include "audio/audio_buffer.h" #include "audio/out/ao.h" #include "audio/filter/af.h" @@ -1561,7 +1560,8 @@ static int mp_property_mixer_active(void *ctx, struct m_property *prop, int action, void *arg) { MPContext *mpctx = ctx; - return m_property_flag_ro(action, arg, mixer_audio_initialized(mpctx->mixer)); + struct ao_chain *ao_c = mpctx->ao_chain; + return m_property_flag_ro(action, arg, ao_c && ao_c->af->initialized > 0); } /// Volume (RW) @@ -1590,7 +1590,7 @@ static int mp_property_volume(void *ctx, struct m_property *prop, int r = mp_property_generic_option(mpctx, prop, action, arg); if (action == M_PROPERTY_SET) - mixer_update_volume(mpctx->mixer); + audio_update_volume(mpctx); return r; } @@ -1607,7 +1607,7 @@ static int mp_property_mute(void *ctx, struct m_property *prop, int r = mp_property_generic_option(mpctx, prop, action, arg); if (action == M_PROPERTY_SET) - mixer_update_volume(mpctx->mixer); + audio_update_volume(mpctx); return r; } @@ -1841,23 +1841,10 @@ static int mp_property_balance(void *ctx, struct m_property *prop, int action, void *arg) { MPContext *mpctx = ctx; - float bal; - switch (action) { - case M_PROPERTY_GET: - mixer_getbalance(mpctx->mixer, arg); - return M_PROPERTY_OK; - case M_PROPERTY_GET_TYPE: - *(struct m_option *)arg = (struct m_option){ - .type = CONF_TYPE_FLOAT, - .flags = M_OPT_RANGE, - .min = -1, - .max = 1, - }; - return M_PROPERTY_OK; - case M_PROPERTY_PRINT: { + if (action == M_PROPERTY_PRINT) { char **str = arg; - mixer_getbalance(mpctx->mixer, &bal); + float bal = mpctx->opts->balance; if (bal == 0.f) *str = talloc_strdup(NULL, "center"); else if (bal == -1.f) @@ -1871,11 +1858,11 @@ static int mp_property_balance(void *ctx, struct m_property *prop, } return M_PROPERTY_OK; } - case M_PROPERTY_SET: - mixer_setbalance(mpctx->mixer, *(float *)arg); - return M_PROPERTY_OK; - } - return M_PROPERTY_NOT_IMPLEMENTED; + + int r = mp_property_generic_option(mpctx, prop, action, arg); + if (action == M_PROPERTY_SET) + audio_update_balance(mpctx); + return r; } static struct track* track_next(struct MPContext *mpctx, enum stream_type type, diff --git a/player/core.h b/player/core.h index 8afcfbe64d..f2a9f191fa 100644 --- a/player/core.h +++ b/player/core.h @@ -287,7 +287,6 @@ typedef struct MPContext { struct lavfi *lavfi; - struct mixer *mixer; struct ao *ao; struct mp_audio *ao_decoder_fmt; // for weak gapless audio check struct ao_chain *ao_chain; @@ -429,6 +428,8 @@ void uninit_audio_out(struct MPContext *mpctx); void uninit_audio_chain(struct MPContext *mpctx); int init_audio_decoder(struct MPContext *mpctx, struct track *track); void reinit_audio_chain_src(struct MPContext *mpctx, struct lavfi_pad *src); +void audio_update_volume(struct MPContext *mpctx); +void audio_update_balance(struct MPContext *mpctx); // configfiles.c void mp_parse_cfgfiles(struct MPContext *mpctx); @@ -558,4 +559,11 @@ int init_video_decoder(struct MPContext *mpctx, struct track *track); int get_deinterlacing(struct MPContext *mpctx); void set_deinterlacing(struct MPContext *mpctx, bool enable); +// Values of MPOpts.softvol +enum { + SOFTVOL_NO = 0, + SOFTVOL_YES = 1, + SOFTVOL_AUTO = 2, +}; + #endif /* MPLAYER_MP_CORE_H */ diff --git a/player/loadfile.c b/player/loadfile.c index 2b88ecfeb0..94d0b2bd5d 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -42,7 +42,6 @@ #include "common/encode.h" #include "input/input.h" -#include "audio/mixer.h" #include "audio/audio.h" #include "audio/audio_buffer.h" #include "audio/decode/dec_audio.h" diff --git a/player/main.c b/player/main.c index 88b60e1937..78652fe562 100644 --- a/player/main.c +++ b/player/main.c @@ -52,7 +52,6 @@ #include "audio/decode/dec_audio.h" #include "audio/out/ao.h" -#include "audio/mixer.h" #include "demux/demux.h" #include "stream/stream.h" #include "sub/osd.h" @@ -360,7 +359,6 @@ struct MPContext *mp_create(void) mpctx->input = mp_input_init(mpctx->global); screenshot_init(mpctx); - mpctx->mixer = mixer_init(mpctx, mpctx->global); command_init(mpctx); init_libav(mpctx->global); mp_clients_init(mpctx); diff --git a/player/playloop.c b/player/playloop.c index 0062a30888..fd16c78e68 100644 --- a/player/playloop.c +++ b/player/playloop.c @@ -36,7 +36,6 @@ #include "osdep/terminal.h" #include "osdep/timer.h" -#include "audio/mixer.h" #include "audio/decode/dec_audio.h" #include "audio/filter/af.h" #include "audio/out/ao.h" |