TT#50652 add stop_media call

Change-Id: I1b18a41d4b97ccbb83499873e50a797f846a8602
changes/44/27744/4
Richard Fuchs 7 years ago
parent 7da2b523a7
commit 7f5e16d3da

@ -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) { const char *call_play_media_ng(bencode_item_t *input, bencode_item_t *output) {
#ifdef WITH_TRANSCODING #ifdef WITH_TRANSCODING
str callid, fromtag, str; str str;
struct call *call; struct call *call;
struct call_monologue *monologue; struct call_monologue *monologue;
const char *err = NULL; const char *err = NULL;
long long db_id; long long db_id;
if (!bencode_dictionary_get_str(input, "call-id", &callid)) err = play_media_select_party(&call, &monologue, input);
return "No call-id in message"; if (err)
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
goto out; goto out;
if (!monologue->player) if (!monologue->player)
@ -1784,8 +1786,39 @@ const char *call_play_media_ng(bencode_item_t *input, bencode_item_t *output) {
err = NULL; err = NULL;
out: out:
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); rwlock_unlock_w(&call->master_lock);
obj_put(call); obj_put(call);
}
return err; return err;
#else #else
return "unsupported"; return "unsupported";

@ -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); errstr = call_play_media_ng(dict, resp);
g_atomic_int_inc(&cur->play_media); g_atomic_int_inc(&cur->play_media);
break; break;
case CSH_LOOKUP("stop media"):
errstr = call_stop_media_ng(dict, resp);
g_atomic_int_inc(&cur->stop_media);
break;
default: default:
errstr = "Unrecognized command"; errstr = "Unrecognized command";
} }

@ -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_block_media_ng(bencode_item_t *, bencode_item_t *);
const char *call_unblock_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_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, void ng_call_stats(struct call *call, const str *fromtag, const str *totag, bencode_item_t *output,
struct call_stats *totals); struct call_stats *totals);

@ -26,6 +26,7 @@ struct control_ng_stats {
int block_media; int block_media;
int unblock_media; int unblock_media;
int play_media; int play_media;
int stop_media;
int errors; int errors;
}; };

Loading…
Cancel
Save