[asterisk-commits] file: branch file/audiohooks r66453 - in /team/file/audiohooks: include/aster...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Tue May 29 10:08:40 MST 2007


Author: file
Date: Tue May 29 12:08:39 2007
New Revision: 66453

URL: http://svn.digium.com/view/asterisk?view=rev&rev=66453
Log:
Add support for adjusting the volume of frames put into the audiohook from the read/write sources.

Modified:
    team/file/audiohooks/include/asterisk/audiohook.h
    team/file/audiohooks/main/audiohook.c

Modified: team/file/audiohooks/include/asterisk/audiohook.h
URL: http://svn.digium.com/view/asterisk/team/file/audiohooks/include/asterisk/audiohook.h?view=diff&rev=66453&r1=66452&r2=66453
==============================================================================
--- team/file/audiohooks/include/asterisk/audiohook.h (original)
+++ team/file/audiohooks/include/asterisk/audiohook.h Tue May 29 12:08:39 2007
@@ -68,6 +68,11 @@
  */
 typedef int (*ast_audiohook_manipulate_callback)(struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction);
 
+struct ast_audiohook_options {
+	int read_volume;  /*!< Volume adjustment on frames read from the channel the hook is on */
+	int write_volume; /*!< Volume adjustment on frames written to the channel the hook is on */
+};
+
 struct ast_audiohook {
 	ast_mutex_t lock;                                      /*!< Lock that protects the audiohook structure */
 	ast_cond_t trigger;                                    /*!< Trigger condition (if enabled) */
@@ -80,6 +85,7 @@
 	int format;                                            /*!< Format translation path is setup as */
 	struct ast_trans_pvt *trans_pvt;                       /*!< Translation path for reading frames */
 	ast_audiohook_manipulate_callback manipulate_callback; /*!< Manipulation callback */
+	struct ast_audiohook_options options;                  /*!< Applicable options */
 	AST_LIST_ENTRY(ast_audiohook) list;                    /*!< Linked list information */
 };
 

Modified: team/file/audiohooks/main/audiohook.c
URL: http://svn.digium.com/view/asterisk/team/file/audiohooks/main/audiohook.c?view=diff&rev=66453&r1=66452&r2=66453
==============================================================================
--- team/file/audiohooks/main/audiohook.c (original)
+++ team/file/audiohooks/main/audiohook.c Tue May 29 12:08:39 2007
@@ -149,6 +149,7 @@
 static struct ast_frame *audiohook_read_frame_single(struct ast_audiohook *audiohook, size_t samples, enum ast_audiohook_direction direction)
 {
 	struct ast_slinfactory *factory = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->read_factory : &audiohook->write_factory);
+	int vol = (direction == AST_AUDIOHOOK_DIRECTION_READ ? audiohook->options.read_volume : audiohook->options.write_volume);
 	short buf[samples];
 	struct ast_frame frame = {
 		.frametype = AST_FRAME_VOICE,
@@ -165,6 +166,10 @@
 	/* Read data in from factory */
 	if (!ast_slinfactory_read(factory, buf, samples))
 		return NULL;
+
+	/* If a volume adjustment needs to be applied apply it */
+	if (vol)
+		ast_frame_adjust_volume(&frame, vol);
 
 	return ast_frdup(&frame);
 }
@@ -185,6 +190,17 @@
 	if (ast_slinfactory_available(&audiohook->read_factory) >= samples) {
 		if (ast_slinfactory_read(&audiohook->read_factory, buf1, samples))
 			read_buf = buf1;
+		/* Adjust read volume if need be */
+		if (audiohook->options.read_volume) {
+			int count = 0;
+			short adjust_value = abs(audiohook->options.read_volume);
+			for (count = 0; count < samples; count++) {
+				if (audiohook->options.read_volume > 0)
+					ast_slinear_saturated_multiply(&buf1[count], &adjust_value);
+				else if (audiohook->options.read_volume < 0)
+					ast_slinear_saturated_divide(&buf1[count], &adjust_value);
+			}
+		}
 	} else if (option_debug)
 		ast_log(LOG_DEBUG, "Failed to get %zd samples from read factory %p\n", samples, &audiohook->read_factory);
 
@@ -192,6 +208,17 @@
 	if (ast_slinfactory_available(&audiohook->write_factory) >= samples) {
 		if (ast_slinfactory_read(&audiohook->write_factory, buf2, samples))
 			write_buf = buf2;
+		/* Adjust write volume if need be */
+		if (audiohook->options.write_volume) {
+			int count = 0;
+			short adjust_value = abs(audiohook->options.write_volume);
+			for (count = 0; count < samples; count++) {
+				if (audiohook->options.write_volume > 0)
+					ast_slinear_saturated_multiply(&buf2[count], &adjust_value);
+				else if (audiohook->options.write_volume < 0)
+					ast_slinear_saturated_divide(&buf2[count], &adjust_value);
+			}
+		}
 	} else if (option_debug)
 		ast_log(LOG_DEBUG, "Failed to get %zd samples from write factory %p\n", samples, &audiohook->write_factory);
 



More information about the asterisk-commits mailing list