static void launch_monitor_thread(struct ast_channel *chan, const char *filename, unsigned int flags, int readvol, int writevol, const char *post_process, const char *filename_write, char *filename_read, const char *uid_channel_var) { pthread_t thread; struct mixmonitor *mixmonitor; char postprocess2[1024] = ""; char *datastore_id = NULL; postprocess2[0] = 0; /* If a post process system command is given attach it to the structure */ if (!ast_strlen_zero(post_process)) { char *p1, *p2; p1 = ast_strdupa(post_process); for (p2 = p1; *p2; p2++) { if (*p2 == '^' && *(p2+1) == '{') { *p2 = '$'; } } pbx_substitute_variables_helper(chan, p1, postprocess2, sizeof(postprocess2) - 1); } /* Pre-allocate mixmonitor structure and spy */ if (!(mixmonitor = ast_calloc(1, sizeof(*mixmonitor)))) { return; } /* Setup the actual spy before creating our thread */ if (ast_audiohook_init(&mixmonitor->audiohook, AST_AUDIOHOOK_TYPE_SPY, mixmonitor_spy_type, 0)) { mixmonitor_free(mixmonitor); return; } /* Copy over flags and channel name */ mixmonitor->flags = flags; if (!(mixmonitor->autochan = ast_autochan_setup(chan))) { mixmonitor_free(mixmonitor); return; } if (setup_mixmonitor_ds(mixmonitor, chan, &datastore_id)) { ast_autochan_destroy(mixmonitor->autochan); mixmonitor_free(mixmonitor); ast_free(datastore_id); return; } if (!ast_strlen_zero(uid_channel_var)) { if (datastore_id) { pbx_builtin_setvar_helper(chan, uid_channel_var, datastore_id); } } ast_free(datastore_id); mixmonitor->name = ast_strdup(ast_channel_name(chan)); if (!ast_strlen_zero(postprocess2)) { mixmonitor->post_process = ast_strdup(postprocess2); } if (!ast_strlen_zero(filename)) { mixmonitor->filename = ast_strdup(filename); } if (!ast_strlen_zero(filename_write)) { mixmonitor->filename_write = ast_strdup(filename_write); } if (!ast_strlen_zero(filename_read)) { mixmonitor->filename_read = ast_strdup(filename_read); } ast_set_flag(&mixmonitor->audiohook, AST_AUDIOHOOK_TRIGGER_SYNC); if (readvol) mixmonitor->audiohook.options.read_volume = readvol; if (writevol) mixmonitor->audiohook.options.write_volume = writevol; if (startmon(chan, &mixmonitor->audiohook)) { ast_log(LOG_WARNING, "Unable to add '%s' spy to channel '%s'\n", mixmonitor_spy_type, ast_channel_name(chan)); ast_audiohook_destroy(&mixmonitor->audiohook); mixmonitor_free(mixmonitor); return; } ast_pthread_create_detached_background(&thread, NULL, mixmonitor_thread, mixmonitor); }
static void launch_monitor_thread(struct ast_channel *chan, const char *filename, unsigned int flags, int readvol, int writevol, const char *post_process) { pthread_attr_t attr; pthread_t thread; struct mixmonitor *mixmonitor; char postprocess2[1024] = ""; size_t len; len = sizeof(*mixmonitor) + strlen(chan->name) + strlen(filename) + 2; /* If a post process system command is given attach it to the structure */ if (!ast_strlen_zero(post_process)) { char *p1, *p2; p1 = ast_strdupa(post_process); for (p2 = p1; *p2 ; p2++) { if (*p2 == '^' && *(p2+1) == '{') { *p2 = '$'; } } pbx_substitute_variables_helper(chan, p1, postprocess2, sizeof(postprocess2) - 1); if (!ast_strlen_zero(postprocess2)) len += strlen(postprocess2) + 1; } /* Pre-allocate mixmonitor structure and spy */ if (!(mixmonitor = calloc(1, len))) { return; } /* Copy over flags and channel name */ mixmonitor->flags = flags; if (setup_mixmonitor_ds(mixmonitor, chan)) { return; } mixmonitor->name = (char *) mixmonitor + sizeof(*mixmonitor); strcpy(mixmonitor->name, chan->name); if (!ast_strlen_zero(postprocess2)) { mixmonitor->post_process = mixmonitor->name + strlen(mixmonitor->name) + strlen(filename) + 2; strcpy(mixmonitor->post_process, postprocess2); } mixmonitor->filename = (char *) mixmonitor + sizeof(*mixmonitor) + strlen(chan->name) + 1; strcpy(mixmonitor->filename, filename); /* Setup the actual spy before creating our thread */ if (ast_audiohook_init(&mixmonitor->audiohook, AST_AUDIOHOOK_TYPE_SPY, mixmonitor_spy_type)) { free(mixmonitor); return; } ast_set_flag(&mixmonitor->audiohook, AST_AUDIOHOOK_TRIGGER_SYNC); if (readvol) mixmonitor->audiohook.options.read_volume = readvol; if (writevol) mixmonitor->audiohook.options.write_volume = writevol; if (startmon(chan, &mixmonitor->audiohook)) { ast_log(LOG_WARNING, "Unable to add '%s' spy to channel '%s'\n", mixmonitor_spy_type, chan->name); /* Since we couldn't add ourselves - bail out! */ ast_audiohook_destroy(&mixmonitor->audiohook); free(mixmonitor); return; } pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ast_pthread_create_background(&thread, &attr, mixmonitor_thread, mixmonitor); pthread_attr_destroy(&attr); }