From aa006ccf859da83d803176cf5f6f2a21a618b202 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Sun, 2 Mar 2025 12:18:33 +0100 Subject: [PATCH] MT#62272 media_player_new: possibility to add opts Add a possibility to add opts when actually creating new media player. This can be useful for cases with MoH implementation. Change-Id: Ie7f9d290cd5e46063dd4095d57a521396b58bcfb --- daemon/audio_player.c | 2 +- daemon/call.c | 2 +- daemon/media_player.c | 13 ++++++++++--- daemon/t38.c | 3 ++- include/media_player.h | 2 +- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/daemon/audio_player.c b/daemon/audio_player.c index 52c1cc50f..91b83c194 100644 --- a/daemon/audio_player.c +++ b/daemon/audio_player.c @@ -108,7 +108,7 @@ bool audio_player_setup(struct call_media *m, const rtp_payload_type *dst_pt, if (mp) media_player_stop(mp); else { - media_player_new(&mp, m->monologue, NULL); + media_player_new(&mp, m->monologue, NULL, NULL); ap->mp = mp; } if (!mp) diff --git a/daemon/call.c b/daemon/call.c index f3f4a01f9..2d8bbfd0e 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2766,7 +2766,6 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c #ifdef WITH_TRANSCODING if (flags->recording_announcement) { - media_player_new(&ml->rec_player, ml, NULL); media_player_opts_t opts = MPO( .repeat = flags->repeat_times, .duration_spent = flags->repeat_duration, @@ -2777,6 +2776,7 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c .blob = flags->blob, .db_id = flags->db_id, ); + media_player_new(&ml->rec_player, ml, NULL, &opts); if (!media_player_add(ml->rec_player, opts)) ilog(LOG_WARN, "Failed to add media player for recording announcement"); diff --git a/daemon/media_player.c b/daemon/media_player.c index 87a44e519..cbcc3a433 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -53,6 +53,7 @@ struct media_player_cache_packet; static void cache_packet_free(struct media_player_cache_packet *p); TYPED_GPTRARRAY_FULL(cache_packet_arr, struct media_player_cache_packet, cache_packet_free) +static void __media_player_set_opts(struct media_player *mp, media_player_opts_t opts); struct media_player_cache_index { struct media_player_content_index index; @@ -234,7 +235,9 @@ static void __media_player_free(struct media_player *mp) { // call->master_lock held in W -void media_player_new(struct media_player **mpp, struct call_monologue *ml, struct ssrc_ctx *prev_ssrc) { +void media_player_new(struct media_player **mpp, struct call_monologue *ml, struct ssrc_ctx *prev_ssrc, + media_player_opts_t *opts) +{ #ifdef WITH_TRANSCODING struct media_player *mp; @@ -264,6 +267,10 @@ void media_player_new(struct media_player **mpp, struct call_monologue *ml, stru mp->ssrc_out = ssrc_ctx; } + /* add opts if given */ + if (opts) + __media_player_set_opts(mp, *opts); + if (!mp->coder.pkt) { mp->coder.pkt = av_packet_alloc(); mp->coder.pkt->data = NULL; @@ -1407,7 +1414,7 @@ static struct media_player_media_file *(*media_player_db_id_get)(unsigned long l static void __media_player_set_opts(struct media_player *mp, media_player_opts_t opts) { mp->opts = opts; - if (mp->opts.block_egress) + if (mp->media && mp->opts.block_egress) MEDIA_SET(mp->media, BLOCK_EGRESS); } @@ -1609,7 +1616,7 @@ const char * call_play_media_for_ml(struct call_monologue *ml, update_init_subscribers(ml, OP_PLAY_MEDIA); /* media_player_new() now knows that audio player is in use * TODO: player options can have changed if already exists */ - media_player_new(&ml->player, ml, NULL); + media_player_new(&ml->player, ml, NULL, &opts); if (opts.file.len) { if (!media_player_play_file(ml->player, opts)) diff --git a/daemon/t38.c b/daemon/t38.c index 01f3d67c3..ab53e19c9 100644 --- a/daemon/t38.c +++ b/daemon/t38.c @@ -407,7 +407,8 @@ int t38_gateway_pair(struct call_media *t38_media, struct call_media *pcm_media, goto err; media_player_new(&tg->pcm_player, pcm_media->monologue, - pcm_media->streams.length ? pcm_media->streams.head->data->ssrc_out[0] : NULL); + (pcm_media->streams.length ? pcm_media->streams.head->data->ssrc_out[0] : NULL), + NULL); // even though we call media_player_set_media() here, we need to call it again in // t38_gateway_start because our sink might not have any streams added here yet, // leaving the media_player setup incomplete diff --git a/include/media_player.h b/include/media_player.h index 9a9e76136..0fa227e18 100644 --- a/include/media_player.h +++ b/include/media_player.h @@ -121,7 +121,7 @@ struct send_timer { #define MPO(...) (media_player_opts_t){__VA_ARGS__} -void media_player_new(struct media_player **, struct call_monologue *, struct ssrc_ctx *prev_ssrc); +void media_player_new(struct media_player **, struct call_monologue *, struct ssrc_ctx *prev_ssrc, media_player_opts_t *); bool media_player_add(struct media_player *mp, media_player_opts_t opts); bool media_player_start(struct media_player *); long long media_player_stop(struct media_player *);