diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index d917b039e..672fa2619 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -1732,28 +1732,30 @@ out: } +#ifdef WITH_TRANSCODING +static const char *play_media_select_party(struct call **call, struct call_monologue **monologue, + bencode_item_t *input) +{ + const char *err = media_block_match(call, monologue, input); + if (err) + return err; + if (!*monologue) + return "No participant party specified"; + return NULL; +} +#endif + + const char *call_play_media_ng(bencode_item_t *input, bencode_item_t *output) { #ifdef WITH_TRANSCODING - str callid, fromtag, str; + str str; struct call *call; struct call_monologue *monologue; const char *err = NULL; long long db_id; - if (!bencode_dictionary_get_str(input, "call-id", &callid)) - return "No call-id in message"; - call = call_get_opmode(&callid, OP_OTHER); - if (!call) - return "Unknown call-id"; - - err = "No participant party specified"; - if (bencode_dictionary_get_str(input, "from-tag", &fromtag)) { - monologue = call_get_mono_dialogue(call, &fromtag, NULL, NULL); - err = "Unknown monologue from-tag"; - if (!monologue) - goto out; - } - else + err = play_media_select_party(&call, &monologue, input); + if (err) goto out; if (!monologue->player) @@ -1784,8 +1786,39 @@ const char *call_play_media_ng(bencode_item_t *input, bencode_item_t *output) { err = NULL; out: - rwlock_unlock_w(&call->master_lock); - obj_put(call); + if (call) { + rwlock_unlock_w(&call->master_lock); + obj_put(call); + } + return err; +#else + return "unsupported"; +#endif +} + + +const char *call_stop_media_ng(bencode_item_t *input, bencode_item_t *output) { +#ifdef WITH_TRANSCODING + struct call *call; + struct call_monologue *monologue; + const char *err = NULL; + + err = play_media_select_party(&call, &monologue, input); + if (err) + goto out; + + if (!monologue->player) + return "Not currently playing media"; + + media_player_stop(monologue->player); + + err = NULL; + +out: + if (call) { + rwlock_unlock_w(&call->master_lock); + obj_put(call); + } return err; #else return "unsupported"; diff --git a/daemon/control_ng.c b/daemon/control_ng.c index 8225f8aac..8a59decce 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -247,6 +247,10 @@ static void control_ng_incoming(struct obj *obj, str *buf, const endpoint_t *sin errstr = call_play_media_ng(dict, resp); g_atomic_int_inc(&cur->play_media); break; + case CSH_LOOKUP("stop media"): + errstr = call_stop_media_ng(dict, resp); + g_atomic_int_inc(&cur->stop_media); + break; default: errstr = "Unrecognized command"; } diff --git a/include/call_interfaces.h b/include/call_interfaces.h index 6fea0c36e..d70431585 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -109,6 +109,7 @@ const char *call_unblock_dtmf_ng(bencode_item_t *, bencode_item_t *); const char *call_block_media_ng(bencode_item_t *, bencode_item_t *); const char *call_unblock_media_ng(bencode_item_t *, bencode_item_t *); const char *call_play_media_ng(bencode_item_t *, bencode_item_t *); +const char *call_stop_media_ng(bencode_item_t *, bencode_item_t *); void ng_call_stats(struct call *call, const str *fromtag, const str *totag, bencode_item_t *output, struct call_stats *totals); diff --git a/include/control_ng.h b/include/control_ng.h index 59fde9ef7..9d6f2b7dc 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -26,6 +26,7 @@ struct control_ng_stats { int block_media; int unblock_media; int play_media; + int stop_media; int errors; };