From 1a8132691a6b75231e50efde672e39745c516f83 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Fri, 20 Dec 2024 14:32:25 +0100 Subject: [PATCH] MT#61630 play media NG: move essential body to a function Move part of the `call_play_media_ng` function body to a separate function, to let it be available for external function calls not particularly related to play media NG function call. Change-Id: Iaf4e8f72f1492446508fd6b49ba36434cae5f5f0 --- daemon/call_interfaces.c | 26 +++----------------------- daemon/media_player.c | 36 ++++++++++++++++++++++++++++++++++++ include/media_player.h | 7 +++++++ 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index b2fa76dc4..ea565f42f 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -3590,15 +3590,6 @@ const char *call_play_media_ng(ng_command_ctx_t *ctx) { for (__auto_type l = monologues.head; l; l = l->next) { struct call_monologue *monologue = l->data; - // if mixing is enabled, codec handlers of all sources must be updated - codec_update_all_source_handlers(monologue, &flags); - // this starts the audio player if needed - update_init_subscribers(monologue, 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(&monologue->player, monologue); - media_player_opts_t opts = MPO( .repeat = flags.repeat_times, .start_pos = flags.start_pos, @@ -3606,20 +3597,9 @@ const char *call_play_media_ng(ng_command_ctx_t *ctx) { .codec_set = flags.codec_set, ); - if (flags.file.len) { - if (!media_player_play_file(monologue->player, &flags.file, opts)) - return "Failed to start media playback from file"; - } - else if (flags.blob.len) { - if (!media_player_play_blob(monologue->player, &flags.blob, opts)) - return "Failed to start media playback from blob"; - } - else if (flags.db_id > 0) { - if (!media_player_play_db(monologue->player, flags.db_id, opts)) - return "Failed to start media playback from database"; - } - else - return "No media file specified"; + err = call_play_media_for_ml(monologue, opts, &flags.file, &flags.blob, flags.db_id, &flags); + if (err) + return err; if (l == monologues.head && monologue->player->coder.duration) parser->dict_add_int(ctx->resp, "duration", monologue->player->coder.duration); diff --git a/daemon/media_player.c b/daemon/media_player.c index 7e4607d32..da343c023 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -1166,6 +1166,42 @@ bool media_player_init_file(struct media_player *mp, const str *file, media_play return ret == 0; } +const char * call_play_media_for_ml(struct call_monologue *ml, + media_player_opts_t opts, + const str * file, + const str * blob, + long long db_id, + sdp_ng_flags *flags) +{ +#ifdef WITH_TRANSCODING + /* if mixing is enabled, codec handlers of all sources must be updated */ + codec_update_all_source_handlers(ml, flags); + + /* this starts the audio player if needed */ + 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); + + if (file->len) { + if (!media_player_play_file(ml->player, file, opts)) + return "Failed to start media playback from file"; + } + else if (blob->len) { + if (!media_player_play_blob(ml->player, blob, opts)) + return "Failed to start media playback from blob"; + } + else if (db_id > 0) { + if (!media_player_play_db(ml->player, db_id, opts)) + return "Failed to start media playback from database"; + } + else + return "No media file specified"; + return NULL; +#else + return "Not implemented"; +#endif +} #ifdef WITH_TRANSCODING static int __mp_avio_read_wrap(void *opaque, uint8_t *buf, int buf_size) { diff --git a/include/media_player.h b/include/media_player.h index c72548ec4..88f29e17d 100644 --- a/include/media_player.h +++ b/include/media_player.h @@ -135,6 +135,13 @@ bool media_player_pt_match(const struct media_player *mp, const rtp_payload_type void media_player_add_packet(struct media_player *mp, char *buf, size_t len, long long us_dur, unsigned long long pts); +const char * call_play_media_for_ml(struct call_monologue *ml, + media_player_opts_t opts, + const str * file, + const str * blob, + long long db_id, + sdp_ng_flags *flags); + void media_player_init(void); void media_player_free(void); void media_player_launch(void);