summaryrefslogtreecommitdiff
path: root/res/res_stasis_playback.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/res_stasis_playback.c')
-rw-r--r--res/res_stasis_playback.c46
1 files changed, 4 insertions, 42 deletions
diff --git a/res/res_stasis_playback.c b/res/res_stasis_playback.c
index ee4a20bcc..299cb4483 100644
--- a/res/res_stasis_playback.c
+++ b/res/res_stasis_playback.c
@@ -78,14 +78,10 @@ struct stasis_app_playback {
long offsetms;
/*! Number of milliseconds to skip for forward/reverse operations */
int skipms;
- /*! Condition for waiting on done to be set */
- ast_cond_t done_cond;
/*! Number of milliseconds of media that has been played */
long playedms;
/*! Current playback state */
enum stasis_app_playback_state state;
- /*! Set when playback has been completed */
- unsigned int done:1;
/*! Set when the playback can be controlled */
unsigned int controllable:1;
};
@@ -121,7 +117,6 @@ static void playback_dtor(void *obj)
struct stasis_app_playback *playback = obj;
ast_string_field_free_memory(playback);
- ast_cond_destroy(&playback->done_cond);
}
static struct stasis_app_playback *playback_create(
@@ -129,7 +124,6 @@ static struct stasis_app_playback *playback_create(
{
RAII_VAR(struct stasis_app_playback *, playback, NULL, ao2_cleanup);
char uuid[AST_UUID_STR_LEN];
- int res;
if (!control) {
return NULL;
@@ -140,13 +134,6 @@ static struct stasis_app_playback *playback_create(
return NULL;
}
- res = ast_cond_init(&playback->done_cond, NULL);
- if (res != 0) {
- ast_log(LOG_ERROR, "Error creating done condition: %s\n",
- strerror(errno));
- return NULL;
- }
-
if (!ast_strlen_zero(id)) {
ast_string_field_set(playback, id, id);
} else {
@@ -266,21 +253,9 @@ static void playback_final_update(struct stasis_app_playback *playback,
playback_publish(playback);
}
-/*!
- * \brief RAII_VAR function to mark a playback as done when leaving scope.
- */
-static void mark_as_done(struct stasis_app_playback *playback)
-{
- SCOPED_AO2LOCK(lock, playback);
- playback->done = 1;
- ast_cond_broadcast(&playback->done_cond);
-}
-
static void play_on_channel(struct stasis_app_playback *playback,
struct ast_channel *chan)
{
- RAII_VAR(struct stasis_app_playback *, mark_when_done, playback,
- mark_as_done);
int res;
long offsetms;
@@ -399,7 +374,6 @@ static int play_uri(struct stasis_app_control *control,
RAII_VAR(struct stasis_app_playback *, playback, NULL,
remove_from_playbacks);
struct ast_bridge *bridge;
- int res;
playback = data;
@@ -413,28 +387,16 @@ static int play_uri(struct stasis_app_control *control,
/* Queue up playback on the bridge */
ast_bridge_lock(bridge);
- bridge_chan = bridge_find_channel(bridge, chan);
+ bridge_chan = ao2_bump(bridge_find_channel(bridge, chan));
+ ast_bridge_unlock(bridge);
if (bridge_chan) {
- ast_bridge_channel_queue_playfile(
+ ast_bridge_channel_queue_playfile_sync(
bridge_chan,
play_on_channel_in_bridge,
playback->id,
NULL); /* moh_class */
}
- ast_bridge_unlock(bridge);
-
- /* Wait for playback to complete */
- ao2_lock(playback);
- while (!playback->done) {
- res = ast_cond_wait(&playback->done_cond,
- ao2_object_get_lockaddr(playback));
- if (res != 0) {
- ast_log(LOG_ERROR,
- "Error waiting for playback to complete: %s\n",
- strerror(errno));
- }
- }
- ao2_unlock(playback);
+ ao2_cleanup(bridge_chan);
} else {
play_on_channel(playback, chan);
}