Author: mikej Date: Tue Dec 5 16:29:14 2006 New Revision: 3546 Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Log: manually merge r3544-3545 from trunk Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c ============================================================================== --- freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c (original) +++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Tue Dec 5 16:29:14 2006 @@ -252,7 +252,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *obj); static void conference_loop_output(conference_member_t *member); static uint32_t conference_stop_file(conference_obj_t *conference, file_stop_t stop); -static switch_status_t conference_play_file(conference_obj_t *conference, char *file, uint32_t leadin); +static switch_status_t conference_play_file(conference_obj_t *conference, char *file, uint32_t leadin, switch_channel_t *channel); static switch_status_t conference_say(conference_obj_t *conference, char *text, uint32_t leadin); static void conference_list(conference_obj_t *conference, switch_stream_handle_t *stream, char *delim); static switch_status_t conf_api_main(char *buf, switch_core_session_t *session, switch_stream_handle_t *stream); @@ -448,11 +448,11 @@ if (conference->enter_sound) { - conference_play_file(conference, conference->enter_sound, CONF_DEFAULT_LEADIN); + conference_play_file(conference, conference->enter_sound, CONF_DEFAULT_LEADIN, switch_core_session_get_channel(member->session)); } if (conference->count == 1 && conference->alone_sound) { - conference_play_file(conference, conference->alone_sound, 0); + conference_play_file(conference, conference->alone_sound, 0, switch_core_session_get_channel(member->session)); } if (conference->min && conference->count >= conference->min) { @@ -521,10 +521,10 @@ switch_set_flag(conference, CFLAG_DESTRUCT); } else { if (conference->exit_sound) { - conference_play_file(conference, conference->exit_sound, 0); + conference_play_file(conference, conference->exit_sound, 0, switch_core_session_get_channel(member->session)); } if (conference->count == 1 && conference->alone_sound) { - conference_play_file(conference, conference->alone_sound, 0); + conference_play_file(conference, conference->alone_sound, 0, switch_core_session_get_channel(member->session)); } } @@ -1550,11 +1550,14 @@ } /* Play a file in the conference room */ -static switch_status_t conference_play_file(conference_obj_t *conference, char *file, uint32_t leadin) +static switch_status_t conference_play_file(conference_obj_t *conference, char *file, uint32_t leadin, switch_channel_t *channel) { confernce_file_node_t *fnode, *nptr; switch_memory_pool_t *pool; uint32_t count; + char *expanded = NULL; + uint8_t frexp = 0; + switch_status_t status = SWITCH_STATUS_SUCCESS; switch_mutex_lock(conference->mutex); switch_mutex_lock(conference->member_mutex); @@ -1566,25 +1569,36 @@ return SWITCH_STATUS_FALSE; } + if (channel) { + if ((expanded = switch_channel_expand_variables(channel, file)) != file) { + file = expanded; + frexp = 1; + } + } + + #ifdef WIN32 if (*(file +1) != ':' && *file != '/') { #else if (*file != '/') { #endif - return conference_say(conference, file, leadin); + status = conference_say(conference, file, leadin); + goto done; } /* Setup a memory pool to use. */ if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Pool Failure\n"); - return SWITCH_STATUS_MEMERR; + status = SWITCH_STATUS_MEMERR; + goto done; } /* Create a node object*/ if (!(fnode = switch_core_alloc(pool, sizeof(*fnode)))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Alloc Failure\n"); switch_core_destroy_memory_pool(&pool); - return SWITCH_STATUS_MEMERR; + status = SWITCH_STATUS_MEMERR; + goto done; } fnode->type = NODE_TYPE_FILE; @@ -1596,7 +1610,8 @@ SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, pool) != SWITCH_STATUS_SUCCESS) { switch_core_destroy_memory_pool(&pool); - return SWITCH_STATUS_NOTFOUND; + status = SWITCH_STATUS_NOTFOUND; + goto done; } fnode->pool = pool; @@ -1612,7 +1627,13 @@ } switch_mutex_unlock(conference->mutex); - return SWITCH_STATUS_SUCCESS; + done: + + if (frexp) { + switch_safe_free(expanded); + } + + return status; } /* Play a file in the conference room to a member */ @@ -2166,7 +2187,7 @@ switch_event_t *event; if (argc == 3) { - if (conference_play_file(conference, argv[2], 0) == SWITCH_STATUS_SUCCESS) { + if (conference_play_file(conference, argv[2], 0, NULL) == SWITCH_STATUS_SUCCESS) { stream->write_function(stream, "(play) Playing file %s\n", argv[2]); if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Conference-Name", conference->name);