From 3167a77aa38b3700c9a4459fa5fe2f65eef080a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Sun, 4 Sep 2022 11:49:23 +0200 Subject: audio: add AOCONTROL_UPDATE_MEDIA_ROLE This is used to notify an AO about the type of media that is being played. Either a movie or music. --- player/audio.c | 26 ++++++++++++++++++++++++++ player/command.c | 3 +++ player/core.h | 1 + 3 files changed, 30 insertions(+) (limited to 'player') diff --git a/player/audio.c b/player/audio.c index 06ea1262a6..9e1bb708d5 100644 --- a/player/audio.c +++ b/player/audio.c @@ -183,6 +183,30 @@ void update_playback_speed(struct MPContext *mpctx) update_speed_filters(mpctx); } +static bool has_video_track(struct MPContext *mpctx) +{ + if (mpctx->vo_chain && mpctx->vo_chain->is_coverart) + return false; + + for (int n = 0; n < mpctx->num_tracks; n++) { + struct track *track = mpctx->tracks[n]; + if (track->type == STREAM_VIDEO && !track->attached_picture && !track->image) + return true; + } + + return false; +} + +void audio_update_media_role(struct MPContext *mpctx) +{ + if (!mpctx->ao) + return; + + enum aocontrol_media_role role = has_video_track(mpctx) ? + AOCONTROL_MEDIA_ROLE_MOVIE : AOCONTROL_MEDIA_ROLE_MUSIC; + ao_control(mpctx->ao, AOCONTROL_UPDATE_MEDIA_ROLE, &role); +} + static void ao_chain_reset_state(struct ao_chain *ao_c) { ao_c->last_out_pts = MP_NOPTS_VALUE; @@ -471,6 +495,8 @@ static int reinit_audio_filters_and_output(struct MPContext *mpctx) audio_update_volume(mpctx); + audio_update_media_role(mpctx); + // Almost nonsensical hack to deal with certain format change scenarios. if (mpctx->audio_status == STATUS_PLAYING) ao_start(mpctx->ao); diff --git a/player/command.c b/player/command.c index 2b4650e062..943f7e887d 100644 --- a/player/command.c +++ b/player/command.c @@ -6539,6 +6539,9 @@ static void command_event(struct MPContext *mpctx, int event, void *arg) } if (event == MP_EVENT_WIN_STATE2) ctx->cached_window_scale = 0; + + if (event == MPV_EVENT_FILE_LOADED) + audio_update_media_role(mpctx); } void handle_command_updates(struct MPContext *mpctx) diff --git a/player/core.h b/player/core.h index 71595ef4f6..c4a75aa25c 100644 --- a/player/core.h +++ b/player/core.h @@ -487,6 +487,7 @@ int init_audio_decoder(struct MPContext *mpctx, struct track *track); void reinit_audio_chain_src(struct MPContext *mpctx, struct track *track); void audio_update_volume(struct MPContext *mpctx); void audio_update_balance(struct MPContext *mpctx); +void audio_update_media_role(struct MPContext *mpctx); void reload_audio_output(struct MPContext *mpctx); void audio_start_ao(struct MPContext *mpctx); -- cgit v1.2.3