[Freeswitch-trunk] [commit] r6706 - in freeswitch/trunk/src: . include mod/applications/mod_conference mod/applications/mod_dptools mod/formats/mod_local_stream mod/formats/mod_native_file mod/formats/mod_sndfile

Freeswitch SVN anthm at freeswitch.org
Wed Dec 12 16:30:56 EST 2007


Author: anthm
Date: Wed Dec 12 16:30:55 2007
New Revision: 6706

Modified:
   freeswitch/trunk/src/include/switch_module_interfaces.h
   freeswitch/trunk/src/include/switch_resample.h
   freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
   freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
   freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c
   freeswitch/trunk/src/mod/formats/mod_native_file/mod_native_file.c
   freeswitch/trunk/src/mod/formats/mod_sndfile/mod_sndfile.c
   freeswitch/trunk/src/switch_core_file.c
   freeswitch/trunk/src/switch_core_session.c
   freeswitch/trunk/src/switch_ivr_play_say.c
   freeswitch/trunk/src/switch_resample.c

Log:
sample platter

Modified: freeswitch/trunk/src/include/switch_module_interfaces.h
==============================================================================
--- freeswitch/trunk/src/include/switch_module_interfaces.h	(original)
+++ freeswitch/trunk/src/include/switch_module_interfaces.h	Wed Dec 12 16:30:55 2007
@@ -40,6 +40,7 @@
 #define SWITCH_MODULE_INTERFACES_H
 
 #include <switch.h>
+#include "switch_resample.h"
 
 SWITCH_BEGIN_EXTERN_C
 /*! \brief A table of functions to execute at various states 
@@ -262,6 +263,8 @@
 	unsigned int samples;
 	/*! the current samplerate */
 	uint32_t samplerate;
+	/*! the current native samplerate */
+	uint32_t native_rate;
 	/*! the number of channels */
 	uint8_t channels;
 	/*! integer representation of the format */
@@ -289,6 +292,10 @@
 	uint32_t offset_pos;
 	uint32_t last_pos;
 	int32_t vol;
+	switch_audio_resampler_t *resampler;
+	switch_buffer_t *buffer;
+	switch_byte_t *dbuf;
+	switch_size_t dbuflen;
 };
 
 /*! \brief Abstract interface to an asr module */

Modified: freeswitch/trunk/src/include/switch_resample.h
==============================================================================
--- freeswitch/trunk/src/include/switch_resample.h	(original)
+++ freeswitch/trunk/src/include/switch_resample.h	Wed Dec 12 16:30:55 2007
@@ -91,7 +91,7 @@
   \brief Destroy an existing resampler handle
   \param resampler the resampler handle to destroy
  */
-SWITCH_DECLARE(void) switch_resample_destroy(switch_audio_resampler_t *resampler);
+SWITCH_DECLARE(void) switch_resample_destroy(switch_audio_resampler_t **resampler);
 
 /*!
   \brief Resample one float buffer into another using specifications of a given handle

Modified: freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c	Wed Dec 12 16:30:55 2007
@@ -1465,6 +1465,9 @@
 		}
 	}
 
+	switch_resample_destroy(&member->read_resampler);
+	switch_resample_destroy(&member->mux_resampler);
+
 	switch_clear_flag_locked(member, MFLAG_ITHREAD);
 
 	return NULL;

Modified: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c	Wed Dec 12 16:30:55 2007
@@ -1239,7 +1239,9 @@
 	int argc;
     char *mydata, *argv[4] = { 0 };
 	char *l = NULL;
-	
+	const char *tmp;
+	int rate;
+
 	channel = switch_core_session_get_channel(session);
 	assert(channel != NULL);
 	
@@ -1280,6 +1282,13 @@
 		}
 	}
 
+	if ((tmp = switch_channel_get_variable(channel, "record_rate"))) {
+		rate = atoi(tmp);
+		if (rate > 0) {
+			fh.samplerate = rate;
+		}
+	}
+
 	args.input_callback = on_dtmf;
 	status = switch_ivr_record_file(session, &fh, path, &args, limit);
 

Modified: freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c	(original)
+++ freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c	Wed Dec 12 16:30:55 2007
@@ -79,7 +79,7 @@
 	local_stream_context_t *cp;
 	char file_buf[128] = "", path_buf[512] = "";
 	switch_timer_t timer = {0};
-
+	int fd = -1;
 
 	if (switch_core_timer_init(&timer, source->timer_name, source->interval, source->samples, source->pool) != SWITCH_STATUS_SUCCESS) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Can't start timer.\n");
@@ -89,7 +89,7 @@
 
 	while(RUNNING) {
 		const char *fname;
-		
+
 		if (switch_dir_open(&source->dir_handle, source->location, source->pool) != SWITCH_STATUS_SUCCESS) {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Can't open directory: %s\n", source->location);
 			return NULL;
@@ -98,27 +98,37 @@
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "open directory: %s\n", source->location);
 		switch_yield(1000000);
 
-		while(RUNNING && (fname = switch_dir_next_file(source->dir_handle, file_buf, sizeof(file_buf)))) {
+		while(RUNNING) {
 			switch_size_t olen;
 			uint8_t abuf[SWITCH_RECOMMENDED_BUFFER_SIZE] =  {0};
 
-			snprintf(path_buf, sizeof(path_buf), "%s%s%s", source->location, SWITCH_PATH_SEPARATOR, fname);
-			if (switch_stristr(".loc", path_buf)) {
-				int fd, bytes;
+			if (fd > -1) {
 				char *p;
+				if (switch_fd_read_line(fd, path_buf, sizeof(path_buf))) {
+					if ((p = strchr(path_buf, '\r')) ||
+						(p = strchr(path_buf, '\n'))) {
+						*p = '\0';
+					}
+				} else {
+					close(fd);
+					fd = -1;
+					continue;
+				}
+			} else {
+				if (!(fname = switch_dir_next_file(source->dir_handle, file_buf, sizeof(file_buf)))) {
+					break;
+				}
+
+				snprintf(path_buf, sizeof(path_buf), "%s%s%s", source->location, SWITCH_PATH_SEPARATOR, fname);
 
-				if ((fd = open(path_buf, O_RDONLY)) < 0) {
-					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open %s\n", fname);
-					switch_yield(1000000);
+				if (switch_stristr(".loc", path_buf)) {
+					if ((fd = open(path_buf, O_RDONLY)) < 0) {
+						switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open %s\n", fname);
+						switch_yield(1000000);
+					}
 					continue;
 				}
 				
-				bytes = read(fd, path_buf, sizeof(path_buf));
-				if ((p = strchr(path_buf, '\r')) ||
-					(p = strchr(path_buf, '\n'))) {
-					*p = '\0';
-				}
-				close(fd);
 			}
 
 			fname = path_buf;
@@ -139,6 +149,7 @@
 			while (RUNNING) {
 				switch_core_timer_next(&timer);
 				olen = source->samples;
+
 				if (switch_core_file_read(&fh, abuf, &olen) != SWITCH_STATUS_SUCCESS || !olen) {
 					switch_core_file_close(&fh);
 					break;
@@ -156,8 +167,13 @@
 		}
 
 		switch_dir_close(source->dir_handle);
+		source->dir_handle = NULL;
 
 	}
+
+	if (fd > -1) {
+		close(fd);
+	}
 	
 	switch_core_destroy_memory_pool(&source->pool);
 
@@ -168,25 +184,37 @@
 {
 	local_stream_context_t *context;
 	local_stream_source_t *source;
+	char *alt_path = NULL;
+	switch_status_t status = SWITCH_STATUS_SUCCESS;
 	
 	if (switch_test_flag(handle, SWITCH_FILE_FLAG_WRITE)) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "This format does not support writing!\n");
 		return SWITCH_STATUS_FALSE;
 	}
 	
+	alt_path = switch_mprintf("%s/%d", path, handle->samplerate);
+
 	switch_mutex_lock(globals.mutex);
-	source = switch_core_hash_find(globals.source_hash, path);
+	if ((source = switch_core_hash_find(globals.source_hash, alt_path))) {
+		path = alt_path;
+	} else {
+		source = switch_core_hash_find(globals.source_hash, path);
+	}
 	switch_mutex_unlock(globals.mutex);
 
 	if (!source) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "unknown source %s\n", path);
-		return SWITCH_STATUS_FALSE;
+		status = SWITCH_STATUS_FALSE;
+		goto end;
 	}
 
 	if ((context = switch_core_alloc(handle->memory_pool, sizeof(*context))) == 0) {
-		return SWITCH_STATUS_MEMERR;
+		status = SWITCH_STATUS_MEMERR;
+		goto end;
 	}	
 
+	
+
 	handle->samples = 0;
 	handle->samplerate = source->rate;
 	handle->channels = source->channels;
@@ -201,7 +229,8 @@
 	switch_mutex_init(&context->audio_mutex, SWITCH_MUTEX_NESTED, handle->memory_pool);
 	if (switch_buffer_create_dynamic(&context->audio_buffer, 512, 1024, 0) != SWITCH_STATUS_SUCCESS) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
-		return SWITCH_STATUS_MEMERR;
+		status = SWITCH_STATUS_MEMERR;
+		goto end;
 	}
 	
 	context->source = source;
@@ -211,8 +240,9 @@
 	source->context_list = context;
 	switch_mutex_unlock(source->mutex);
 
-
-	return SWITCH_STATUS_SUCCESS;
+ end:
+	switch_safe_free(alt_path);
+	return status;
 }
 
 static switch_status_t local_stream_file_close(switch_file_handle_t *handle)
@@ -350,6 +380,7 @@
 		}
 		
 		source->samples = switch_bytes_per_frame(source->rate, source->interval);
+
 		switch_core_hash_insert(globals.source_hash, source->name, source);
 		
 		switch_mutex_init(&source->mutex, SWITCH_MUTEX_NESTED, source->pool);

Modified: freeswitch/trunk/src/mod/formats/mod_native_file/mod_native_file.c
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_native_file/mod_native_file.c	(original)
+++ freeswitch/trunk/src/mod/formats/mod_native_file/mod_native_file.c	Wed Dec 12 16:30:55 2007
@@ -26,7 +26,7 @@
  * Anthony Minessale II <anthmct at yahoo.com>
  *
  *
- * mod_native_file.c -- Framework Demo Module
+ * mod_native_file.c -- Native Files
  *
  */
 #include <switch.h>

Modified: freeswitch/trunk/src/mod/formats/mod_sndfile/mod_sndfile.c
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_sndfile/mod_sndfile.c	(original)
+++ freeswitch/trunk/src/mod/formats/mod_sndfile/mod_sndfile.c	Wed Dec 12 16:30:55 2007
@@ -61,6 +61,9 @@
 	int mode = 0;
 	char *ext;
 	struct format_map *map = NULL;
+	switch_status_t status = SWITCH_STATUS_SUCCESS;
+	char *alt_path = NULL, *next, *last, *ldup = NULL;
+	size_t alt_len = 0;
 
 	if ((ext = strrchr(path, '.')) == 0) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Format\n");
@@ -141,11 +144,28 @@
 	if ((mode & SFM_WRITE) && sf_format_check(&context->sfinfo) == 0) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error : file format is invalid (0x%08X).\n", context->sfinfo.format);
 		return SWITCH_STATUS_GENERR;
-	};
+	}
 
-	if ((context->handle = sf_open(path, mode, &context->sfinfo)) == 0) {
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening File [%s] [%s]\n", path, sf_strerror(context->handle));
-		return SWITCH_STATUS_GENERR;
+	alt_len = strlen(path) + 10;
+	switch_zmalloc(alt_path, alt_len);
+	
+	switch_copy_string(alt_path, path, alt_len);
+	if ((last = strrchr(alt_path, *SWITCH_PATH_SEPARATOR))) {
+		next = ++last;
+		ldup = strdup(last);
+		switch_assert(ldup);
+		switch_snprintf(next, alt_len - (last - alt_path), "%d%s%s", handle->samplerate, SWITCH_PATH_SEPARATOR, ldup);
+		if ((context->handle = sf_open(alt_path, mode, &context->sfinfo))) {
+			path = alt_path;
+		}
+	}
+	
+	if (!context->handle) {
+		if ((context->handle = sf_open(path, mode, &context->sfinfo)) == 0) {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening File [%s] [%s]\n", path, sf_strerror(context->handle));
+			status = SWITCH_STATUS_GENERR;
+			goto end;
+		}
 	}
 
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Opening File [%s] %dhz\n", path, context->sfinfo.samplerate);
@@ -157,8 +177,15 @@
 	handle->seekable = context->sfinfo.seekable;
 	handle->speed = 0;
 	handle->private_info = context;
+		
 
-	return SWITCH_STATUS_SUCCESS;
+ end:
+	
+	switch_safe_free(alt_path);
+	switch_safe_free(ldup);
+	
+
+	return status;
 }
 
 static switch_status_t sndfile_file_close(switch_file_handle_t *handle)

Modified: freeswitch/trunk/src/switch_core_file.c
==============================================================================
--- freeswitch/trunk/src/switch_core_file.c	(original)
+++ freeswitch/trunk/src/switch_core_file.c	Wed Dec 12 16:30:55 2007
@@ -73,10 +73,10 @@
 		fh->handler = switch_core_strdup(fh->memory_pool, rhs);
 	}
 
-	if (rate) {
-		fh->samplerate = rate;
-	} else {
-		rate = 8000;
+	if (!fh->samplerate) {
+		if (!(fh->samplerate = rate)) {
+			fh->samplerate = 8000;
+		}
 	}
 
 	if (channels) {
@@ -85,25 +85,130 @@
 		fh->channels = 1;
 	}
 
-	if ((status = fh->file_interface->file_open(fh, file_path)) == SWITCH_STATUS_SUCCESS) {
-		switch_set_flag(fh, SWITCH_FILE_OPEN);
+	if ((status = fh->file_interface->file_open(fh, file_path)) != SWITCH_STATUS_SUCCESS) {
+		return status;
+	}
+
+	if ((flags & SWITCH_FILE_FLAG_READ)) {
+		fh->native_rate = fh->samplerate;
+	} else {
+		fh->native_rate = rate;
+	}
+	
+	if (fh->samplerate != rate) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Sample rate doesn't match\n");
+		if ((flags & SWITCH_FILE_FLAG_READ)) {
+			fh->samplerate = rate;
+		}
 	}
 
+	switch_set_flag(fh, SWITCH_FILE_OPEN);
+
 	return status;
 }
 
 SWITCH_DECLARE(switch_status_t) switch_core_file_read(switch_file_handle_t *fh, void *data, switch_size_t *len)
 {
+	switch_status_t status;
+	switch_size_t orig_len = *len;
+	
 	switch_assert(fh != NULL);
 	switch_assert(fh->file_interface != NULL);
 
-	return fh->file_interface->file_read(fh, data, len);
+	if (fh->buffer && switch_buffer_inuse(fh->buffer)) {
+		*len = switch_buffer_read(fh->buffer, data, orig_len);
+		return SWITCH_STATUS_SUCCESS;
+	}
+
+	if ((status = fh->file_interface->file_read(fh, data, len)) != SWITCH_STATUS_SUCCESS) {
+		goto done;
+	}
+
+	if (!switch_test_flag(fh, SWITCH_FILE_NATIVE) && fh->native_rate != fh->samplerate) {
+		if (!fh->resampler) {
+			if (switch_resample_create(&fh->resampler,
+									   fh->native_rate,
+									   orig_len * 10,
+									   fh->samplerate,
+									   orig_len * 10,
+									   fh->memory_pool) != SWITCH_STATUS_SUCCESS) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n");
+				return SWITCH_STATUS_GENERR;
+			}
+		}
+		
+		fh->resampler->from_len = switch_short_to_float(data, fh->resampler->from, (int) *len);
+		fh->resampler->to_len = 
+			switch_resample_process(fh->resampler, fh->resampler->from, fh->resampler->from_len, fh->resampler->to, fh->resampler->to_size, 0);
+
+		if (fh->resampler->to_len > orig_len) {
+			if (!fh->buffer) {
+				switch_buffer_create_dynamic(&fh->buffer, fh->resampler->to_len * 2, fh->resampler->to_len * 4, fh->resampler->to_len * 8);
+				switch_assert(fh->buffer);
+			}
+			if (!fh->dbuf) {
+				fh->dbuflen = fh->resampler->to_len * 2;
+				fh->dbuf = switch_core_alloc(fh->memory_pool, fh->dbuflen);
+			}
+			switch_assert(fh->resampler->to_len <= fh->dbuflen);
+			
+			switch_float_to_short(fh->resampler->to, (int16_t *) fh->dbuf, fh->resampler->to_len);
+			switch_buffer_write(fh->buffer, fh->dbuf, fh->resampler->to_len * 2);
+			*len = switch_buffer_read(fh->buffer, data, orig_len);
+		} else {
+			switch_float_to_short(fh->resampler->to, data, fh->resampler->to_len);
+			*len = fh->resampler->to_len;
+		}
+		
+	}
+
+ done:
+
+	return status;
 }
 
 SWITCH_DECLARE(switch_status_t) switch_core_file_write(switch_file_handle_t *fh, void *data, switch_size_t *len)
 {
+	switch_size_t orig_len = *len;
+
 	switch_assert(fh != NULL);
 	switch_assert(fh->file_interface != NULL);
+	
+	if (!switch_test_flag(fh, SWITCH_FILE_NATIVE) && fh->native_rate != fh->samplerate) {
+		if (!fh->resampler) {
+			if (switch_resample_create(&fh->resampler,
+									   fh->native_rate,
+									   orig_len * 10,
+									   fh->samplerate,
+									   orig_len * 10,
+									   fh->memory_pool) != SWITCH_STATUS_SUCCESS) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n");
+				return SWITCH_STATUS_GENERR;
+			}
+		}
+		
+		fh->resampler->from_len = switch_short_to_float(data, fh->resampler->from, (int) *len);
+		fh->resampler->to_len = 
+			switch_resample_process(fh->resampler, fh->resampler->from, fh->resampler->from_len, fh->resampler->to, fh->resampler->to_size, 0);
+		if (fh->resampler->to_len > orig_len) {
+			if (!fh->dbuf) {
+				fh->dbuflen = fh->resampler->to_len * 2;
+				fh->dbuf = switch_core_alloc(fh->memory_pool, fh->dbuflen);
+			}
+			switch_assert(fh->resampler->to_len <= fh->dbuflen);
+			switch_float_to_short(fh->resampler->to, (int16_t *) fh->dbuf, fh->resampler->to_len);
+			data = fh->dbuf;
+		} else {
+			switch_float_to_short(fh->resampler->to, data, fh->resampler->to_len);
+		}
+
+		*len = fh->resampler->to_len;
+		
+	}
+
+	if (!*len) {
+		return SWITCH_STATUS_SUCCESS;
+	}
 
 	return fh->file_interface->file_write(fh, data, len);
 }
@@ -151,6 +256,13 @@
 	switch_clear_flag(fh, SWITCH_FILE_OPEN);
 	status = fh->file_interface->file_close(fh);
 
+	if (fh->buffer) {
+		switch_buffer_destroy(&fh->buffer);
+	}
+
+	switch_resample_destroy(&fh->resampler);
+
+
 	if (switch_test_flag(fh, SWITCH_FILE_FLAG_FREE_POOL)) {
 		switch_core_destroy_memory_pool(&fh->memory_pool);
 	}

Modified: freeswitch/trunk/src/switch_core_session.c
==============================================================================
--- freeswitch/trunk/src/switch_core_session.c	(original)
+++ freeswitch/trunk/src/switch_core_session.c	Wed Dec 12 16:30:55 2007
@@ -566,11 +566,9 @@
 	char buf[256];
 	switch_size_t has;
 
-	/* sweep theese under the rug, they wont be leaked they will be reclaimed
-	   when the session ends.
-	 */
-	session->read_resampler = NULL;
-	session->write_resampler = NULL;
+	/* clear resamplers*/
+	switch_resample_destroy(&session->read_resampler);
+	switch_resample_destroy(&session->write_resampler);
 
 	/* clear indications */
 	switch_core_session_flush_message(session);

Modified: freeswitch/trunk/src/switch_ivr_play_say.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_play_say.c	(original)
+++ freeswitch/trunk/src/switch_ivr_play_say.c	Wed Dec 12 16:30:55 2007
@@ -348,8 +348,6 @@
 	const char *vval;
 	time_t start = 0;
 	uint32_t org_silence_hits = 0;
-	switch_audio_resampler_t *resampler = NULL;
-	int16_t resamp_out[2048];
 
 	if (!fh) {
 		fh = &lfh;
@@ -362,27 +360,13 @@
 	switch_assert(read_codec != NULL);
 
 	fh->channels = read_codec->implementation->number_of_channels;
+	fh->native_rate = read_codec->implementation->actual_samples_per_second;
 
-	if (fh->samplerate) {
-		if (fh->samplerate != read_codec->implementation->actual_samples_per_second) {
-			if (switch_resample_create(&resampler,
-									   read_codec->implementation->actual_samples_per_second,
-									   read_codec->implementation->actual_samples_per_second * 20,
-									   fh->samplerate,
-									   fh->samplerate * 20,
-									   switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
-				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n");
-				return SWITCH_STATUS_GENERR;
-			}
-		}
-	} else {
-		fh->samplerate = read_codec->implementation->actual_samples_per_second;
-	}
 
 	if (switch_core_file_open(fh,
 							  file,
 							  fh->channels,
-							  fh->samplerate,
+							  read_codec->implementation->actual_samples_per_second,
 							  SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
 		switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
 		switch_core_session_reset(session);
@@ -553,18 +537,10 @@
 			}
 		}
 
-		if (!switch_test_flag(fh, SWITCH_FILE_PAUSE)) {
+		if (!switch_test_flag(fh, SWITCH_FILE_PAUSE) && !switch_test_flag(read_frame, SFF_CNG)) {
 			int16_t *data = read_frame->data;
 			len = (switch_size_t) read_frame->datalen / 2;
 			
-			if (resampler) {
-				resampler->from_len = switch_short_to_float(read_frame->data, resampler->from, (int) len);
-				resampler->to_len = switch_resample_process(resampler, resampler->from, resampler->from_len, resampler->to, resampler->to_size, 0);
-				switch_float_to_short(resampler->to, resamp_out, read_frame->datalen);
-				len = resampler->to_len;
-				data = resamp_out;
-			}
-			
 			if (switch_core_file_write(fh, data, &len) != SWITCH_STATUS_SUCCESS) {
 				break;
 			}

Modified: freeswitch/trunk/src/switch_resample.c
==============================================================================
--- freeswitch/trunk/src/switch_resample.c	(original)
+++ freeswitch/trunk/src/switch_resample.c	Wed Dec 12 16:30:55 2007
@@ -111,11 +111,17 @@
 #endif
 }
 
-SWITCH_DECLARE(void) switch_resample_destroy(switch_audio_resampler_t *resampler)
+SWITCH_DECLARE(void) switch_resample_destroy(switch_audio_resampler_t **resampler)
 {
+
+	if (resampler && *resampler) {
 #ifndef DISABLE_RESAMPLE
-	resample_close(resampler->resampler);
+		if ((*resampler)->resampler) {
+			resample_close((*resampler)->resampler);
+		}
 #endif
+		*resampler = NULL;
+	}
 }
 
 



More information about the Freeswitch-trunk mailing list