Asterisk - The Open Source Telephony Project GIT-master-a358458
Data Structures | Functions
resource_bridges.h File Reference

Generated file - declares stubs to be implemented in res/ari/resource_bridges.c. More...

#include "asterisk/ari.h"
Include dependency graph for resource_bridges.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_ari_bridges_add_channel_args
 
struct  ast_ari_bridges_clear_video_source_args
 
struct  ast_ari_bridges_create_args
 
struct  ast_ari_bridges_create_with_id_args
 
struct  ast_ari_bridges_destroy_args
 
struct  ast_ari_bridges_get_args
 
struct  ast_ari_bridges_list_args
 
struct  ast_ari_bridges_play_args
 
struct  ast_ari_bridges_play_with_id_args
 
struct  ast_ari_bridges_record_args
 
struct  ast_ari_bridges_remove_channel_args
 
struct  ast_ari_bridges_set_video_source_args
 
struct  ast_ari_bridges_start_moh_args
 
struct  ast_ari_bridges_stop_moh_args
 

Functions

void ast_ari_bridges_add_channel (struct ast_variable *headers, struct ast_ari_bridges_add_channel_args *args, struct ast_ari_response *response)
 Add a channel to a bridge. More...
 
int ast_ari_bridges_add_channel_parse_body (struct ast_json *body, struct ast_ari_bridges_add_channel_args *args)
 Body parsing function for /bridges/{bridgeId}/addChannel. More...
 
void ast_ari_bridges_clear_video_source (struct ast_variable *headers, struct ast_ari_bridges_clear_video_source_args *args, struct ast_ari_response *response)
 Removes any explicit video source in a multi-party mixing bridge. This operation has no effect on bridges with two or fewer participants. When no explicit video source is set, talk detection will be used to determine the active video stream. More...
 
void ast_ari_bridges_create (struct ast_variable *headers, struct ast_ari_bridges_create_args *args, struct ast_ari_response *response)
 Create a new bridge. More...
 
int ast_ari_bridges_create_parse_body (struct ast_json *body, struct ast_ari_bridges_create_args *args)
 Body parsing function for /bridges. More...
 
void ast_ari_bridges_create_with_id (struct ast_variable *headers, struct ast_ari_bridges_create_with_id_args *args, struct ast_ari_response *response)
 Create a new bridge or updates an existing one. More...
 
int ast_ari_bridges_create_with_id_parse_body (struct ast_json *body, struct ast_ari_bridges_create_with_id_args *args)
 Body parsing function for /bridges/{bridgeId}. More...
 
void ast_ari_bridges_destroy (struct ast_variable *headers, struct ast_ari_bridges_destroy_args *args, struct ast_ari_response *response)
 Shut down a bridge. More...
 
void ast_ari_bridges_get (struct ast_variable *headers, struct ast_ari_bridges_get_args *args, struct ast_ari_response *response)
 Get bridge details. More...
 
void ast_ari_bridges_list (struct ast_variable *headers, struct ast_ari_bridges_list_args *args, struct ast_ari_response *response)
 List all active bridges in Asterisk. More...
 
void ast_ari_bridges_play (struct ast_variable *headers, struct ast_ari_bridges_play_args *args, struct ast_ari_response *response)
 Start playback of media on a bridge. More...
 
int ast_ari_bridges_play_parse_body (struct ast_json *body, struct ast_ari_bridges_play_args *args)
 Body parsing function for /bridges/{bridgeId}/play. More...
 
void ast_ari_bridges_play_with_id (struct ast_variable *headers, struct ast_ari_bridges_play_with_id_args *args, struct ast_ari_response *response)
 Start playback of media on a bridge. More...
 
int ast_ari_bridges_play_with_id_parse_body (struct ast_json *body, struct ast_ari_bridges_play_with_id_args *args)
 Body parsing function for /bridges/{bridgeId}/play/{playbackId}. More...
 
void ast_ari_bridges_record (struct ast_variable *headers, struct ast_ari_bridges_record_args *args, struct ast_ari_response *response)
 Start a recording. More...
 
int ast_ari_bridges_record_parse_body (struct ast_json *body, struct ast_ari_bridges_record_args *args)
 Body parsing function for /bridges/{bridgeId}/record. More...
 
void ast_ari_bridges_remove_channel (struct ast_variable *headers, struct ast_ari_bridges_remove_channel_args *args, struct ast_ari_response *response)
 Remove a channel from a bridge. More...
 
int ast_ari_bridges_remove_channel_parse_body (struct ast_json *body, struct ast_ari_bridges_remove_channel_args *args)
 Body parsing function for /bridges/{bridgeId}/removeChannel. More...
 
void ast_ari_bridges_set_video_source (struct ast_variable *headers, struct ast_ari_bridges_set_video_source_args *args, struct ast_ari_response *response)
 Set a channel as the video source in a multi-party mixing bridge. This operation has no effect on bridges with two or fewer participants. More...
 
void ast_ari_bridges_start_moh (struct ast_variable *headers, struct ast_ari_bridges_start_moh_args *args, struct ast_ari_response *response)
 Play music on hold to a bridge or change the MOH class that is playing. More...
 
int ast_ari_bridges_start_moh_parse_body (struct ast_json *body, struct ast_ari_bridges_start_moh_args *args)
 Body parsing function for /bridges/{bridgeId}/moh. More...
 
void ast_ari_bridges_stop_moh (struct ast_variable *headers, struct ast_ari_bridges_stop_moh_args *args, struct ast_ari_response *response)
 Stop playing music on hold to a bridge. More...
 

Detailed Description

Generated file - declares stubs to be implemented in res/ari/resource_bridges.c.

Bridge resources

Author
David M. Lee, II dlee@.nosp@m.digi.nosp@m.um.co.nosp@m.m

Definition in file resource_bridges.h.

Function Documentation

◆ ast_ari_bridges_add_channel()

void ast_ari_bridges_add_channel ( struct ast_variable headers,
struct ast_ari_bridges_add_channel_args args,
struct ast_ari_response response 
)

Add a channel to a bridge.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 191 of file resource_bridges.c.

194{
195 RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
196 RAII_VAR(struct control_list *, list, NULL, ao2_cleanup);
197 size_t i;
198 int has_error = 0;
199
200 if (!bridge) {
201 /* Response filled in by find_bridge() */
202 return;
203 }
204
205 list = control_list_create(response, args->channel_count, args->channel);
206 if (!list) {
207 /* Response filled in by control_list_create() */
208 return;
209 }
210
211 for (i = 0; i < list->count; ++i) {
212 stasis_app_control_clear_roles(list->controls[i]);
213 if (!ast_strlen_zero(args->role)) {
214 if (stasis_app_control_add_role(list->controls[i], args->role)) {
216 return;
217 }
218 }
219
220 /* Apply bridge features to each of the channel controls */
221 if (!stasis_app_control_bridge_features_init(list->controls[i])) {
222 stasis_app_control_absorb_dtmf_in_bridge(list->controls[i], args->absorb_dtmf);
223 stasis_app_control_mute_in_bridge(list->controls[i], args->mute);
224 stasis_app_control_inhibit_colp_in_bridge(list->controls[i], args->inhibit_connected_line_updates);
225 }
226 }
227
228 for (i = 0; i < list->count; ++i) {
229 if ((has_error = check_add_remove_channel(response, list->controls[i],
231 list->controls[i], bridge)))) {
232 break;
233 }
234 }
235
236 if (!has_error) {
238 }
239}
void ast_ari_response_alloc_failed(struct ast_ari_response *response)
Fill in response with a 500 message for allocation failures.
Definition: res_ari.c:298
void ast_ari_response_no_content(struct ast_ari_response *response)
Fill in a No Content (204) ast_ari_response.
Definition: res_ari.c:284
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define NULL
Definition: resample.c:96
static struct control_list * control_list_create(struct ast_ari_response *response, size_t count, const char **channels)
static struct ast_bridge * find_bridge(struct ast_ari_response *response, const char *bridge_id)
Finds a bridge, filling the response with an error, if appropriate.
static int check_add_remove_channel(struct ast_ari_response *response, struct stasis_app_control *control, enum stasis_app_control_channel_result result)
void stasis_app_control_mute_in_bridge(struct stasis_app_control *control, int mute)
Set whether audio from the channel is muted instead of passing through to the bridge.
Definition: control.c:1490
int stasis_app_control_add_channel_to_bridge(struct stasis_app_control *control, struct ast_bridge *bridge)
Add a channel to the bridge.
Definition: control.c:1403
void stasis_app_control_clear_roles(struct stasis_app_control *control)
Clear bridge roles currently applied to a channel controlled by a stasis app control.
Definition: control.c:358
void stasis_app_control_absorb_dtmf_in_bridge(struct stasis_app_control *control, int absorb)
Set whether DTMF from the channel is absorbed instead of passing through to the bridge.
Definition: control.c:1484
int stasis_app_control_add_role(struct stasis_app_control *control, const char *role)
Apply a bridge role to a channel controlled by a stasis app control.
Definition: control.c:336
void stasis_app_control_inhibit_colp_in_bridge(struct stasis_app_control *control, int inhibit_colp)
Set whether COLP frames should be generated when joining the bridge.
Definition: control.c:1496
int stasis_app_control_bridge_features_init(struct stasis_app_control *control)
Initialize bridge features into a channel control.
Definition: control.c:1471
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Structure that contains information about a bridge.
Definition: bridge.h:349
const char * args
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:941

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_no_content(), ast_strlen_zero(), check_add_remove_channel(), control_list_create(), find_bridge(), NULL, RAII_VAR, stasis_app_control_absorb_dtmf_in_bridge(), stasis_app_control_add_channel_to_bridge(), stasis_app_control_add_role(), stasis_app_control_bridge_features_init(), stasis_app_control_clear_roles(), stasis_app_control_inhibit_colp_in_bridge(), and stasis_app_control_mute_in_bridge().

Referenced by ast_ari_bridges_add_channel_cb().

◆ ast_ari_bridges_add_channel_parse_body()

int ast_ari_bridges_add_channel_parse_body ( struct ast_json body,
struct ast_ari_bridges_add_channel_args args 
)

Body parsing function for /bridges/{bridgeId}/addChannel.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 406 of file res_ari_bridges.c.

409{
410 struct ast_json *field;
411 /* Parse query parameters out of it */
412 field = ast_json_object_get(body, "channel");
413 if (field) {
414 /* If they were silly enough to both pass in a query param and a
415 * JSON body, free up the query value.
416 */
417 ast_free(args->channel);
418 if (ast_json_typeof(field) == AST_JSON_ARRAY) {
419 /* Multiple param passed as array */
420 size_t i;
421 args->channel_count = ast_json_array_size(field);
422 args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
423
424 if (!args->channel) {
425 return -1;
426 }
427
428 for (i = 0; i < args->channel_count; ++i) {
429 args->channel[i] = ast_json_string_get(ast_json_array_get(field, i));
430 }
431 } else {
432 /* Multiple param passed as single value */
433 args->channel_count = 1;
434 args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
435 if (!args->channel) {
436 return -1;
437 }
438 args->channel[0] = ast_json_string_get(field);
439 }
440 }
441 field = ast_json_object_get(body, "role");
442 if (field) {
443 args->role = ast_json_string_get(field);
444 }
445 field = ast_json_object_get(body, "absorbDTMF");
446 if (field) {
447 args->absorb_dtmf = ast_json_is_true(field);
448 }
449 field = ast_json_object_get(body, "mute");
450 if (field) {
451 args->mute = ast_json_is_true(field);
452 }
453 field = ast_json_object_get(body, "inhibitConnectedLineUpdates");
454 if (field) {
455 args->inhibit_connected_line_updates = ast_json_is_true(field);
456 }
457 return 0;
458}
#define ast_free(a)
Definition: astmm.h:180
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
enum ast_json_type ast_json_typeof(const struct ast_json *value)
Get the type of value.
Definition: json.c:78
struct ast_json * ast_json_array_get(const struct ast_json *array, size_t index)
Get an element from an array.
Definition: json.c:370
@ AST_JSON_ARRAY
Definition: json.h:165
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
Definition: json.c:283
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
Definition: json.c:407
int ast_json_is_true(const struct ast_json *value)
Check if value is JSON true.
Definition: json.c:263
size_t ast_json_array_size(const struct ast_json *array)
Get the size of a JSON array.
Definition: json.c:366
Abstract JSON element (object, array, string, int, ...).

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_is_true(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_bridges_add_channel_cb().

◆ ast_ari_bridges_clear_video_source()

void ast_ari_bridges_clear_video_source ( struct ast_variable headers,
struct ast_ari_bridges_clear_video_source_args args,
struct ast_ari_response response 
)

Removes any explicit video source in a multi-party mixing bridge. This operation has no effect on bridges with two or fewer participants. When no explicit video source is set, talk detection will be used to determine the active video stream.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1072 of file resource_bridges.c.

1074{
1075 struct ast_bridge *bridge;
1076
1077 bridge = find_bridge(response, args->bridge_id);
1078 if (!bridge) {
1079 return;
1080 }
1081
1082 ast_bridge_lock(bridge);
1084 ast_bridge_unlock(bridge);
1085
1086 ao2_ref(bridge, -1);
1088}
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
void ast_bridge_set_talker_src_video_mode(struct ast_bridge *bridge)
Set the bridge to pick the strongest talker supporting video as the single source video feed.
Definition: bridge.c:3766
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:481
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:470

References ao2_ref, args, ast_ari_response_no_content(), ast_bridge_lock, ast_bridge_set_talker_src_video_mode(), ast_bridge_unlock, and find_bridge().

Referenced by ast_ari_bridges_clear_video_source_cb().

◆ ast_ari_bridges_create()

void ast_ari_bridges_create ( struct ast_variable headers,
struct ast_ari_bridges_create_args args,
struct ast_ari_response response 
)

Create a new bridge.

This bridge persists until it has been shut down, or Asterisk has been shut down.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 946 of file resource_bridges.c.

949{
950 RAII_VAR(struct ast_bridge *, bridge, stasis_app_bridge_create(args->type, args->name, args->bridge_id), ao2_cleanup);
951 RAII_VAR(struct ast_bridge_snapshot *, snapshot, NULL, ao2_cleanup);
952
953 if (!bridge) {
955 response, 500, "Internal Error",
956 "Unable to create bridge");
957 return;
958 }
959
960 ast_bridge_lock(bridge);
961 snapshot = ast_bridge_snapshot_create(bridge);
962 ast_bridge_unlock(bridge);
963
964 if (!snapshot) {
966 response, 500, "Internal Error",
967 "Unable to create snapshot for new bridge");
968 return;
969 }
970
971 ast_ari_response_ok(response,
973}
void ast_ari_response_error(struct ast_ari_response *response, int response_code, const char *response_text, const char *message_fmt,...)
Fill in an error ast_ari_response.
Definition: res_ari.c:259
void ast_ari_response_ok(struct ast_ari_response *response, struct ast_json *message)
Fill in an OK (200) ast_ari_response.
Definition: res_ari.c:276
struct stasis_message_sanitizer * stasis_app_get_sanitizer(void)
Get the Stasis message sanitizer for app_stasis applications.
Definition: res_stasis.c:2271
struct ast_bridge * stasis_app_bridge_create(const char *type, const char *name, const char *id)
Create a bridge of the specified type.
Definition: res_stasis.c:854
struct ast_json * ast_bridge_snapshot_to_json(const struct ast_bridge_snapshot *snapshot, const struct stasis_message_sanitizer *sanitize)
Build a JSON object from a ast_bridge_snapshot.
struct ast_bridge_snapshot * ast_bridge_snapshot_create(struct ast_bridge *bridge)
Generate a snapshot of the bridge state. This is an ao2 object, so ao2_cleanup() to deallocate.
Structure that contains a snapshot of information about a bridge.
Definition: bridge.h:314

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_ok(), ast_bridge_lock, ast_bridge_snapshot_create(), ast_bridge_snapshot_to_json(), ast_bridge_unlock, NULL, RAII_VAR, stasis_app_bridge_create(), and stasis_app_get_sanitizer().

Referenced by ast_ari_bridges_create_cb().

◆ ast_ari_bridges_create_parse_body()

int ast_ari_bridges_create_parse_body ( struct ast_json body,
struct ast_ari_bridges_create_args args 
)

Body parsing function for /bridges.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 107 of file res_ari_bridges.c.

110{
111 struct ast_json *field;
112 /* Parse query parameters out of it */
113 field = ast_json_object_get(body, "type");
114 if (field) {
115 args->type = ast_json_string_get(field);
116 }
117 field = ast_json_object_get(body, "bridgeId");
118 if (field) {
119 args->bridge_id = ast_json_string_get(field);
120 }
121 field = ast_json_object_get(body, "name");
122 if (field) {
123 args->name = ast_json_string_get(field);
124 }
125 return 0;
126}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_bridges_create_cb().

◆ ast_ari_bridges_create_with_id()

void ast_ari_bridges_create_with_id ( struct ast_variable headers,
struct ast_ari_bridges_create_with_id_args args,
struct ast_ari_response response 
)

Create a new bridge or updates an existing one.

This bridge persists until it has been shut down, or Asterisk has been shut down.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 975 of file resource_bridges.c.

978{
979 RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
980 RAII_VAR(struct ast_bridge_snapshot *, snapshot, NULL, ao2_cleanup);
981
982 if (bridge) {
983 /* update */
984 if (!ast_strlen_zero(args->name)
985 && strcmp(args->name, bridge->name)) {
987 response, 500, "Internal Error",
988 "Changing bridge name is not implemented");
989 return;
990 }
991 if (!ast_strlen_zero(args->type)) {
993 response, 500, "Internal Error",
994 "Supplying a bridge type when updating a bridge is not allowed.");
995 return;
996 }
997 ast_ari_response_ok(response,
999 return;
1000 }
1001
1002 bridge = stasis_app_bridge_create(args->type, args->name, args->bridge_id);
1003 if (!bridge) {
1005 response, 500, "Internal Error",
1006 "Unable to create bridge");
1007 return;
1008 }
1009
1010 ast_bridge_lock(bridge);
1011 snapshot = ast_bridge_snapshot_create(bridge);
1012 ast_bridge_unlock(bridge);
1013
1014 if (!snapshot) {
1016 response, 500, "Internal Error",
1017 "Unable to create snapshot for new bridge");
1018 return;
1019 }
1020
1021 ast_ari_response_ok(response,
1023}

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_ok(), ast_bridge_lock, ast_bridge_snapshot_create(), ast_bridge_snapshot_to_json(), ast_bridge_unlock, ast_strlen_zero(), find_bridge(), NULL, RAII_VAR, stasis_app_bridge_create(), and stasis_app_get_sanitizer().

Referenced by ast_ari_bridges_create_with_id_cb().

◆ ast_ari_bridges_create_with_id_parse_body()

int ast_ari_bridges_create_with_id_parse_body ( struct ast_json body,
struct ast_ari_bridges_create_with_id_args args 
)

Body parsing function for /bridges/{bridgeId}.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 197 of file res_ari_bridges.c.

200{
201 struct ast_json *field;
202 /* Parse query parameters out of it */
203 field = ast_json_object_get(body, "type");
204 if (field) {
205 args->type = ast_json_string_get(field);
206 }
207 field = ast_json_object_get(body, "name");
208 if (field) {
209 args->name = ast_json_string_get(field);
210 }
211 return 0;
212}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_bridges_create_with_id_cb().

◆ ast_ari_bridges_destroy()

void ast_ari_bridges_destroy ( struct ast_variable headers,
struct ast_ari_bridges_destroy_args args,
struct ast_ari_response response 
)

Shut down a bridge.

If any channels are in this bridge, they will be removed and resume whatever they were doing beforehand.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 882 of file resource_bridges.c.

885{
886 RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
887 if (!bridge) {
888 return;
889 }
890
893}
void stasis_app_bridge_destroy(const char *bridge_id)
Destroy the bridge.
Definition: res_stasis.c:864

References ao2_cleanup, args, ast_ari_response_no_content(), ast_channel::bridge, find_bridge(), RAII_VAR, and stasis_app_bridge_destroy().

Referenced by ast_ari_bridges_destroy_cb().

◆ ast_ari_bridges_get()

void ast_ari_bridges_get ( struct ast_variable headers,
struct ast_ari_bridges_get_args args,
struct ast_ari_response response 
)

Get bridge details.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 866 of file resource_bridges.c.

869{
871 if (!snapshot) {
873 response, 404, "Not Found",
874 "Bridge not found");
875 return;
876 }
877
878 ast_ari_response_ok(response,
880}
struct ast_bridge_snapshot * ast_bridge_get_snapshot_by_uniqueid(const char *bridge_id)
Returns the current snapshot for the bridge.

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_ok(), ast_bridge_get_snapshot_by_uniqueid(), ast_bridge_snapshot_to_json(), RAII_VAR, ast_channel::snapshot, and stasis_app_get_sanitizer().

Referenced by ast_ari_bridges_get_cb().

◆ ast_ari_bridges_list()

void ast_ari_bridges_list ( struct ast_variable headers,
struct ast_ari_bridges_list_args args,
struct ast_ari_response response 
)

List all active bridges in Asterisk.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 895 of file resource_bridges.c.

898{
900 RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
901 struct ao2_iterator i;
902 struct ast_bridge *bridge;
903
905 if (!bridges) {
907 return;
908 }
909
910 json = ast_json_array_create();
911 if (!json) {
913 return;
914 }
915
917 while ((bridge = ao2_iterator_next(&i))) {
918 struct ast_bridge_snapshot *snapshot;
919 struct ast_json *json_bridge = NULL;
920
921 /* Invisible bridges don't get shown externally and have no snapshot */
923 ao2_ref(bridge, -1);
924 continue;
925 }
926
927 snapshot = ast_bridge_get_snapshot(bridge);
928 if (snapshot) {
929 json_bridge = ast_bridge_snapshot_to_json(snapshot, stasis_app_get_sanitizer());
930 ao2_ref(snapshot, -1);
931 }
932
933 ao2_ref(bridge, -1);
934
935 if (!json_bridge || ast_json_array_append(json, json_bridge)) {
938 return;
939 }
940 }
942
943 ast_ari_response_ok(response, ast_json_ref(json));
944}
#define ao2_iterator_next(iter)
Definition: astobj2.h:1911
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
static struct ao2_container * bridges
Definition: bridge.c:123
struct ao2_container * ast_bridges(void)
Returns the global bridges container.
Definition: bridge.c:174
@ AST_BRIDGE_FLAG_INVISIBLE
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
int ast_json_array_append(struct ast_json *array, struct ast_json *value)
Append to an array.
Definition: json.c:378
struct ast_json * ast_json_array_create(void)
Create a empty JSON array.
Definition: json.c:362
struct ast_json * ast_json_ref(struct ast_json *value)
Increase refcount on value.
Definition: json.c:67
struct ast_bridge_snapshot * ast_bridge_get_snapshot(struct ast_bridge *bridge)
Returns the current snapshot for the bridge.
Generic container type.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1821
struct ast_flags feature_flags
Definition: bridge.h:369
#define ast_test_flag(p, flag)
Definition: utils.h:63

References ao2_cleanup, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_ari_response_alloc_failed(), ast_ari_response_ok(), AST_BRIDGE_FLAG_INVISIBLE, ast_bridge_get_snapshot(), ast_bridge_snapshot_to_json(), ast_bridges(), ast_json_array_append(), ast_json_array_create(), ast_json_ref(), ast_json_unref(), ast_test_flag, bridges, ast_bridge::feature_flags, NULL, RAII_VAR, and stasis_app_get_sanitizer().

Referenced by ast_ari_bridges_list_cb().

◆ ast_ari_bridges_play()

void ast_ari_bridges_play ( struct ast_variable headers,
struct ast_ari_bridges_play_args args,
struct ast_ari_response response 
)

Start playback of media on a bridge.

The media URI may be any of a number of URI's. Currently sound:, recording:, number:, digits:, characters:, and tone: URI's are supported. This operation creates a playback resource that can be used to control the playback of media (pause, rewind, fast forward, etc.)

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 616 of file resource_bridges.c.

619{
620 ari_bridges_handle_play(args->bridge_id,
621 args->media,
622 args->media_count,
623 args->lang,
624 args->offsetms,
625 args->skipms,
626 args->playback_id,
627 response);
628}
static void ari_bridges_handle_play(const char *args_bridge_id, const char **args_media, size_t args_media_count, const char *args_lang, int args_offset_ms, int args_skipms, const char *args_playback_id, struct ast_ari_response *response)

References args, and ari_bridges_handle_play().

Referenced by ast_ari_bridges_play_cb().

◆ ast_ari_bridges_play_parse_body()

int ast_ari_bridges_play_parse_body ( struct ast_json body,
struct ast_ari_bridges_play_args args 
)

Body parsing function for /bridges/{bridgeId}/play.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1010 of file res_ari_bridges.c.

1013{
1014 struct ast_json *field;
1015 /* Parse query parameters out of it */
1016 field = ast_json_object_get(body, "media");
1017 if (field) {
1018 /* If they were silly enough to both pass in a query param and a
1019 * JSON body, free up the query value.
1020 */
1021 ast_free(args->media);
1022 if (ast_json_typeof(field) == AST_JSON_ARRAY) {
1023 /* Multiple param passed as array */
1024 size_t i;
1025 args->media_count = ast_json_array_size(field);
1026 args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1027
1028 if (!args->media) {
1029 return -1;
1030 }
1031
1032 for (i = 0; i < args->media_count; ++i) {
1033 args->media[i] = ast_json_string_get(ast_json_array_get(field, i));
1034 }
1035 } else {
1036 /* Multiple param passed as single value */
1037 args->media_count = 1;
1038 args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1039 if (!args->media) {
1040 return -1;
1041 }
1042 args->media[0] = ast_json_string_get(field);
1043 }
1044 }
1045 field = ast_json_object_get(body, "lang");
1046 if (field) {
1047 args->lang = ast_json_string_get(field);
1048 }
1049 field = ast_json_object_get(body, "offsetms");
1050 if (field) {
1051 args->offsetms = ast_json_integer_get(field);
1052 }
1053 field = ast_json_object_get(body, "skipms");
1054 if (field) {
1055 args->skipms = ast_json_integer_get(field);
1056 }
1057 field = ast_json_object_get(body, "playbackId");
1058 if (field) {
1059 args->playback_id = ast_json_string_get(field);
1060 }
1061 return 0;
1062}
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
Definition: json.c:332

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_integer_get(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_bridges_play_cb().

◆ ast_ari_bridges_play_with_id()

void ast_ari_bridges_play_with_id ( struct ast_variable headers,
struct ast_ari_bridges_play_with_id_args args,
struct ast_ari_response response 
)

Start playback of media on a bridge.

The media URI may be any of a number of URI's. Currently sound:, recording:, number:, digits:, characters:, and tone: URI's are supported. This operation creates a playback resource that can be used to control the playback of media (pause, rewind, fast forward, etc.)

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 630 of file resource_bridges.c.

633{
634 ari_bridges_handle_play(args->bridge_id,
635 args->media,
636 args->media_count,
637 args->lang,
638 args->offsetms,
639 args->skipms,
640 args->playback_id,
641 response);
642}

References args, and ari_bridges_handle_play().

Referenced by ast_ari_bridges_play_with_id_cb().

◆ ast_ari_bridges_play_with_id_parse_body()

int ast_ari_bridges_play_with_id_parse_body ( struct ast_json body,
struct ast_ari_bridges_play_with_id_args args 
)

Body parsing function for /bridges/{bridgeId}/play/{playbackId}.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1189 of file res_ari_bridges.c.

1192{
1193 struct ast_json *field;
1194 /* Parse query parameters out of it */
1195 field = ast_json_object_get(body, "media");
1196 if (field) {
1197 /* If they were silly enough to both pass in a query param and a
1198 * JSON body, free up the query value.
1199 */
1200 ast_free(args->media);
1201 if (ast_json_typeof(field) == AST_JSON_ARRAY) {
1202 /* Multiple param passed as array */
1203 size_t i;
1204 args->media_count = ast_json_array_size(field);
1205 args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1206
1207 if (!args->media) {
1208 return -1;
1209 }
1210
1211 for (i = 0; i < args->media_count; ++i) {
1212 args->media[i] = ast_json_string_get(ast_json_array_get(field, i));
1213 }
1214 } else {
1215 /* Multiple param passed as single value */
1216 args->media_count = 1;
1217 args->media = ast_malloc(sizeof(*args->media) * args->media_count);
1218 if (!args->media) {
1219 return -1;
1220 }
1221 args->media[0] = ast_json_string_get(field);
1222 }
1223 }
1224 field = ast_json_object_get(body, "lang");
1225 if (field) {
1226 args->lang = ast_json_string_get(field);
1227 }
1228 field = ast_json_object_get(body, "offsetms");
1229 if (field) {
1230 args->offsetms = ast_json_integer_get(field);
1231 }
1232 field = ast_json_object_get(body, "skipms");
1233 if (field) {
1234 args->skipms = ast_json_integer_get(field);
1235 }
1236 return 0;
1237}

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_integer_get(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_bridges_play_with_id_cb().

◆ ast_ari_bridges_record()

void ast_ari_bridges_record ( struct ast_variable headers,
struct ast_ari_bridges_record_args args,
struct ast_ari_response response 
)

Start a recording.

This records the mixed audio from all channels participating in this bridge.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 644 of file resource_bridges.c.

647{
648 RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
649 RAII_VAR(struct ast_channel *, record_channel, NULL, ast_hangup);
650 RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
651 RAII_VAR(struct stasis_app_recording *, recording, NULL, ao2_cleanup);
652 RAII_VAR(char *, recording_url, NULL, ast_free);
653 RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
655 RAII_VAR(char *, uri_encoded_name, NULL, ast_free);
656 RAII_VAR(struct stasis_forward *, channel_forward, NULL, stasis_forward_cancel);
657
658 struct stasis_topic *channel_topic;
659 struct stasis_topic *bridge_topic;
660 size_t uri_name_maxlen;
661 struct bridge_channel_control_thread_data *thread_data;
662 pthread_t threadid;
663
664 ast_assert(response != NULL);
665
666 if (bridge == NULL) {
667 return;
668 }
669
670 if (!(record_channel = prepare_bridge_media_channel("Recorder"))) {
672 response, 500, "Internal Server Error", "Failed to create recording channel");
673 return;
674 }
675
676 bridge_topic = ast_bridge_topic(bridge);
677 channel_topic = ast_channel_topic(record_channel);
678
679 /* Forward messages from the recording channel topic to the bridge topic so that anything listening for
680 * messages on the bridge topic will receive the recording start/stop messages. Other messages that would
681 * go to this channel will be suppressed since the channel is marked as internal.
682 */
683 if (!bridge_topic || !channel_topic || !(channel_forward = stasis_forward_all(channel_topic, bridge_topic))) {
685 response, 500, "Internal Error", "Could not forward record channel stasis messages to bridge topic");
686 return;
687 }
688
689 if (ast_unreal_channel_push_to_bridge(record_channel, bridge,
692 response, 500, "Internal Error", "Failed to put recording channel into the bridge");
693 return;
694 }
695
696 control = stasis_app_control_create(record_channel);
697 if (control == NULL) {
699 return;
700 }
701
703 if (options == NULL) {
705 return;
706 }
707
708 ast_string_field_build(options, target, "bridge:%s", args->bridge_id);
709 options->max_silence_seconds = args->max_silence_seconds;
710 options->max_duration_seconds = args->max_duration_seconds;
711 options->terminate_on =
713 options->if_exists =
715 options->beep = args->beep;
716
717 if (options->terminate_on == STASIS_APP_RECORDING_TERMINATE_INVALID) {
719 response, 400, "Bad Request",
720 "terminateOn invalid");
721 return;
722 }
723
724 if (options->if_exists == AST_RECORD_IF_EXISTS_ERROR) {
726 response, 400, "Bad Request",
727 "ifExists invalid");
728 return;
729 }
730
731 if (!ast_get_format_for_file_ext(options->format)) {
733 response, 422, "Unprocessable Entity",
734 "specified format is unknown on this system");
735 return;
736 }
737
739 if (recording == NULL) {
740 switch(errno) {
741 case EINVAL:
742 /* While the arguments are invalid, we should have
743 * caught them prior to calling record.
744 */
746 response, 500, "Internal Server Error",
747 "Error parsing request");
748 break;
749 case EEXIST:
750 ast_ari_response_error(response, 409, "Conflict",
751 "Recording '%s' already exists and can not be overwritten",
752 args->name);
753 break;
754 case ENOMEM:
756 break;
757 case EPERM:
759 response, 400, "Bad Request",
760 "Recording name invalid");
761 break;
762 default:
764 "Unrecognized recording error: %s\n",
765 strerror(errno));
767 response, 500, "Internal Server Error",
768 "Internal Server Error");
769 break;
770 }
771 return;
772 }
773
774 uri_name_maxlen = strlen(args->name) * 3;
775 uri_encoded_name = ast_malloc(uri_name_maxlen);
776 if (!uri_encoded_name) {
778 return;
779 }
780 ast_uri_encode(args->name, uri_encoded_name, uri_name_maxlen, ast_uri_http);
781
782 if (ast_asprintf(&recording_url, "/recordings/live/%s",
783 uri_encoded_name) == -1) {
784 recording_url = NULL;
786 return;
787 }
788
789 json = stasis_app_recording_to_json(recording);
790 if (!json) {
792 return;
793 }
794
795 thread_data = ast_calloc(1, sizeof(*thread_data));
796 if (!thread_data) {
798 return;
799 }
800
801 thread_data->bridge_channel = record_channel;
802 thread_data->control = control;
803 thread_data->forward = channel_forward;
804
805 if (ast_pthread_create_detached(&threadid, NULL, bridge_channel_control_thread, thread_data)) {
807 ast_free(thread_data);
808 return;
809 }
810
811 /* These are owned by the other thread now, so we don't want RAII_VAR disposing of them. */
812 record_channel = NULL;
813 control = NULL;
814 channel_forward = NULL;
815
816 ast_ari_response_created(response, recording_url, ast_json_ref(json));
817}
void ast_ari_response_created(struct ast_ari_response *response, const char *url, struct ast_json *message)
Fill in a Created (201) ast_ari_response.
Definition: res_ari.c:305
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define ast_log
Definition: astobj2.c:42
@ AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE
@ AST_BRIDGE_CHANNEL_FLAG_LONELY
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2541
struct stasis_topic * ast_channel_topic(struct ast_channel *chan)
A topic which publishes the events for a particular channel.
int ast_unreal_channel_push_to_bridge(struct ast_channel *ast, struct ast_bridge *bridge, unsigned int flags)
Push the semi2 unreal channel into a bridge from either member of the unreal pair.
Definition: core_unreal.c:928
struct ast_format * ast_get_format_for_file_ext(const char *file_ext)
Get the ast_format associated with the given file extension.
Definition: file.c:2006
@ AST_RECORD_IF_EXISTS_ERROR
#define LOG_WARNING
int errno
static void * bridge_channel_control_thread(void *data)
static struct ast_channel * prepare_bridge_media_channel(const char *type)
struct stasis_forward * stasis_forward_cancel(struct stasis_forward *forward)
Definition: stasis.c:1548
struct stasis_forward * stasis_forward_all(struct stasis_topic *from_topic, struct stasis_topic *to_topic)
Create a subscription which forwards all messages from one topic to another.
Definition: stasis.c:1578
struct stasis_app_control * stasis_app_control_create(struct ast_channel *chan)
Creates a control handler for a channel that isn't in a stasis app.
Definition: res_stasis.c:333
struct stasis_app_recording_options * stasis_app_recording_options_create(const char *name, const char *format)
Allocate a recording options object.
struct ast_json * stasis_app_recording_to_json(const struct stasis_app_recording *recording)
Construct a JSON model of a recording.
struct stasis_app_recording * stasis_app_control_record(struct stasis_app_control *control, struct stasis_app_recording_options *options)
Record media from a channel.
enum ast_record_if_exists stasis_app_recording_if_exists_parse(const char *str)
Parse a string into the if_exists enum.
#define STASIS_APP_RECORDING_TERMINATE_INVALID
char stasis_app_recording_termination_parse(const char *str)
Parse a string into the recording termination enum.
struct stasis_topic * ast_bridge_topic(struct ast_bridge *bridge)
A topic which publishes the events for a particular bridge.
#define ast_string_field_build(x, field, fmt, args...)
Set a field to a complex (built) value.
Definition: stringfields.h:555
Main Channel structure associated with a channel.
struct stasis_app_control * control
Forwarding information.
Definition: stasis.c:1531
static struct test_options options
#define ast_assert(a)
Definition: utils.h:739
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: utils.c:723
const struct ast_flags ast_uri_http
Definition: utils.c:719
#define ast_pthread_create_detached(a, b, c, d)
Definition: utils.h:588

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_created(), ast_ari_response_error(), ast_asprintf, ast_assert, AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE, AST_BRIDGE_CHANNEL_FLAG_LONELY, ast_bridge_topic(), ast_calloc, ast_channel_topic(), ast_free, ast_get_format_for_file_ext(), ast_hangup(), ast_json_ref(), ast_json_unref(), ast_log, ast_malloc, ast_pthread_create_detached, AST_RECORD_IF_EXISTS_ERROR, ast_string_field_build, ast_unreal_channel_push_to_bridge(), ast_uri_encode(), ast_uri_http, ast_channel::bridge, bridge_channel_control_thread_data::bridge_channel, bridge_channel_control_thread(), ast_channel::channel_forward, bridge_channel_control_thread_data::control, errno, find_bridge(), bridge_channel_control_thread_data::forward, LOG_WARNING, NULL, options, prepare_bridge_media_channel(), RAII_VAR, stasis_app_control_create(), stasis_app_control_record(), stasis_app_recording_if_exists_parse(), stasis_app_recording_options_create(), STASIS_APP_RECORDING_TERMINATE_INVALID, stasis_app_recording_termination_parse(), stasis_app_recording_to_json(), stasis_forward_all(), and stasis_forward_cancel().

Referenced by ast_ari_bridges_record_cb().

◆ ast_ari_bridges_record_parse_body()

int ast_ari_bridges_record_parse_body ( struct ast_json body,
struct ast_ari_bridges_record_args args 
)

Body parsing function for /bridges/{bridgeId}/record.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 1364 of file res_ari_bridges.c.

1367{
1368 struct ast_json *field;
1369 /* Parse query parameters out of it */
1370 field = ast_json_object_get(body, "name");
1371 if (field) {
1372 args->name = ast_json_string_get(field);
1373 }
1374 field = ast_json_object_get(body, "format");
1375 if (field) {
1376 args->format = ast_json_string_get(field);
1377 }
1378 field = ast_json_object_get(body, "maxDurationSeconds");
1379 if (field) {
1380 args->max_duration_seconds = ast_json_integer_get(field);
1381 }
1382 field = ast_json_object_get(body, "maxSilenceSeconds");
1383 if (field) {
1384 args->max_silence_seconds = ast_json_integer_get(field);
1385 }
1386 field = ast_json_object_get(body, "ifExists");
1387 if (field) {
1388 args->if_exists = ast_json_string_get(field);
1389 }
1390 field = ast_json_object_get(body, "beep");
1391 if (field) {
1392 args->beep = ast_json_is_true(field);
1393 }
1394 field = ast_json_object_get(body, "terminateOn");
1395 if (field) {
1396 args->terminate_on = ast_json_string_get(field);
1397 }
1398 return 0;
1399}

References args, ast_json_integer_get(), ast_json_is_true(), ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_bridges_record_cb().

◆ ast_ari_bridges_remove_channel()

void ast_ari_bridges_remove_channel ( struct ast_variable headers,
struct ast_ari_bridges_remove_channel_args args,
struct ast_ari_response response 
)

Remove a channel from a bridge.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 241 of file resource_bridges.c.

244{
245 RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
246 RAII_VAR(struct control_list *, list, NULL, ao2_cleanup);
247 size_t i;
248
249 if (!bridge) {
250 /* Response filled in by find_bridge() */
251 return;
252 }
253
254 list = control_list_create(response, args->channel_count, args->channel);
255 if (!list) {
256 /* Response filled in by control_list_create() */
257 return;
258 }
259
260 /* Make sure all of the channels are in this bridge */
261 for (i = 0; i < list->count; ++i) {
262 if (stasis_app_get_bridge(list->controls[i]) != bridge) {
263 ast_log(LOG_WARNING, "Channel %s not in bridge %s\n",
264 args->channel[i], args->bridge_id);
265 ast_ari_response_error(response, 422,
266 "Unprocessable Entity",
267 "Channel not in this bridge");
268 return;
269 }
270 }
271
272 /* Now actually remove it */
273 for (i = 0; i < list->count; ++i) {
275 bridge);
276 }
277
279}
int stasis_app_control_remove_channel_from_bridge(struct stasis_app_control *control, struct ast_bridge *bridge)
Remove a channel from the bridge.
Definition: control.c:1440
struct ast_bridge * stasis_app_get_bridge(struct stasis_app_control *control)
Gets the bridge currently associated with a control object.
Definition: control.c:951

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), ast_log, control_list_create(), find_bridge(), LOG_WARNING, NULL, RAII_VAR, stasis_app_control_remove_channel_from_bridge(), and stasis_app_get_bridge().

Referenced by ast_ari_bridges_remove_channel_cb().

◆ ast_ari_bridges_remove_channel_parse_body()

int ast_ari_bridges_remove_channel_parse_body ( struct ast_json body,
struct ast_ari_bridges_remove_channel_args args 
)

Body parsing function for /bridges/{bridgeId}/removeChannel.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 587 of file res_ari_bridges.c.

590{
591 struct ast_json *field;
592 /* Parse query parameters out of it */
593 field = ast_json_object_get(body, "channel");
594 if (field) {
595 /* If they were silly enough to both pass in a query param and a
596 * JSON body, free up the query value.
597 */
598 ast_free(args->channel);
599 if (ast_json_typeof(field) == AST_JSON_ARRAY) {
600 /* Multiple param passed as array */
601 size_t i;
602 args->channel_count = ast_json_array_size(field);
603 args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
604
605 if (!args->channel) {
606 return -1;
607 }
608
609 for (i = 0; i < args->channel_count; ++i) {
610 args->channel[i] = ast_json_string_get(ast_json_array_get(field, i));
611 }
612 } else {
613 /* Multiple param passed as single value */
614 args->channel_count = 1;
615 args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
616 if (!args->channel) {
617 return -1;
618 }
619 args->channel[0] = ast_json_string_get(field);
620 }
621 }
622 return 0;
623}

References args, ast_free, AST_JSON_ARRAY, ast_json_array_get(), ast_json_array_size(), ast_json_object_get(), ast_json_string_get(), ast_json_typeof(), and ast_malloc.

Referenced by ast_ari_bridges_remove_channel_cb().

◆ ast_ari_bridges_set_video_source()

void ast_ari_bridges_set_video_source ( struct ast_variable headers,
struct ast_ari_bridges_set_video_source_args args,
struct ast_ari_response response 
)

Set a channel as the video source in a multi-party mixing bridge. This operation has no effect on bridges with two or fewer participants.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 1037 of file resource_bridges.c.

1039{
1040 struct ast_bridge *bridge;
1041 struct stasis_app_control *control;
1042
1043 bridge = find_bridge(response, args->bridge_id);
1044 if (!bridge) {
1045 return;
1046 }
1047
1048 control = find_channel_control(response, args->channel_id);
1049 if (!control) {
1050 ao2_ref(bridge, -1);
1051 return;
1052 }
1053
1054 if (stasis_app_get_bridge(control) != bridge) {
1055 ast_ari_response_error(response, 422,
1056 "Unprocessable Entity",
1057 "Channel not in this bridge");
1058 ao2_ref(bridge, -1);
1059 ao2_ref(control, -1);
1060 return;
1061 }
1062
1065
1066 ao2_ref(bridge, -1);
1067 ao2_ref(control, -1);
1068
1070}
void __ao2_cleanup(void *obj)
Definition: astobj2.c:677
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
static struct stasis_app_control * find_channel_control(struct ast_ari_response *response, const char *channel_id)
Finds the control object for a channel, filling the response with an error, if appropriate.
static int bridge_set_video_source_cb(struct stasis_app_control *control, struct ast_channel *chan, void *data)
int stasis_app_send_command(struct stasis_app_control *control, stasis_app_command_cb command, void *data, command_data_destructor_fn data_destructor)
Invokes a command on a control's channel.
Definition: control.c:918
struct ast_bridge * bridge
Definition: control.c:64

References __ao2_cleanup(), ao2_bump, ao2_ref, args, ast_ari_response_error(), ast_ari_response_no_content(), stasis_app_control::bridge, bridge_set_video_source_cb(), find_bridge(), find_channel_control(), stasis_app_get_bridge(), and stasis_app_send_command().

Referenced by ast_ari_bridges_set_video_source_cb().

◆ ast_ari_bridges_start_moh()

void ast_ari_bridges_start_moh ( struct ast_variable headers,
struct ast_ari_bridges_start_moh_args args,
struct ast_ari_response response 
)

Play music on hold to a bridge or change the MOH class that is playing.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 819 of file resource_bridges.c.

822{
823 RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
824 struct ast_channel *moh_channel;
825 const char *moh_class = args->moh_class;
826
827 if (!bridge) {
828 /* The response is provided by find_bridge() */
829 return;
830 }
831
833 if (!moh_channel) {
835 return;
836 }
837
838 ast_moh_start(moh_channel, moh_class, NULL);
839 ast_channel_cleanup(moh_channel);
840
842
843}
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition: channel.h:2969
int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
Turn on music on hold on a given channel.
Definition: channel.c:7766
struct ast_channel * stasis_app_bridge_moh_channel(struct ast_bridge *bridge)
Finds or creates an announcer channel in a bridge that can play music on hold.
Definition: res_stasis.c:629
struct ast_bridge * bridge

References ao2_cleanup, args, ast_ari_response_alloc_failed(), ast_ari_response_no_content(), ast_channel_cleanup, ast_moh_start(), ast_channel::bridge, find_bridge(), NULL, RAII_VAR, and stasis_app_bridge_moh_channel().

Referenced by ast_ari_bridges_start_moh_cb().

◆ ast_ari_bridges_start_moh_parse_body()

int ast_ari_bridges_start_moh_parse_body ( struct ast_json body,
struct ast_ari_bridges_start_moh_args args 
)

Body parsing function for /bridges/{bridgeId}/moh.

Parameters
bodyThe JSON body from which to parse parameters.
[out]argsThe args structure to parse into.
Return values
zeroon success
non-zeroon failure

Definition at line 865 of file res_ari_bridges.c.

868{
869 struct ast_json *field;
870 /* Parse query parameters out of it */
871 field = ast_json_object_get(body, "mohClass");
872 if (field) {
873 args->moh_class = ast_json_string_get(field);
874 }
875 return 0;
876}

References args, ast_json_object_get(), and ast_json_string_get().

Referenced by ast_ari_bridges_start_moh_cb().

◆ ast_ari_bridges_stop_moh()

void ast_ari_bridges_stop_moh ( struct ast_variable headers,
struct ast_ari_bridges_stop_moh_args args,
struct ast_ari_response response 
)

Stop playing music on hold to a bridge.

This will only stop music on hold being played via POST bridges/{bridgeId}/moh.

Parameters
headersHTTP headers
argsSwagger parameters
[out]responseHTTP response

Definition at line 845 of file resource_bridges.c.

848{
849 RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup);
850
851 if (!bridge) {
852 /* the response is provided by find_bridge() */
853 return;
854 }
855
856 if (stasis_app_bridge_moh_stop(bridge)) {
858 response, 409, "Conflict",
859 "Bridge isn't playing music");
860 return;
861 }
862
864}
int stasis_app_bridge_moh_stop(struct ast_bridge *bridge)
Breaks down MOH channels playing on the bridge created by stasis_app_bridge_moh_channel.
Definition: res_stasis.c:649

References ao2_cleanup, args, ast_ari_response_error(), ast_ari_response_no_content(), ast_channel::bridge, find_bridge(), RAII_VAR, and stasis_app_bridge_moh_stop().

Referenced by ast_ari_bridges_stop_moh_cb().