All pastes #1015762 Raw Edit

Audiohook proposed addition

public diff v1 · immutable
#1015762 ·published 2008-05-12 14:15 UTC
rendered paste body
Index: include/asterisk/audiohook.h===================================================================--- include/asterisk/audiohook.h	(revision 115587)+++ include/asterisk/audiohook.h	(working copy)@@ -44,6 +44,7 @@ 	AST_AUDIOHOOK_STATUS_RUNNING,  /*!< Audiohook is running on a channel */ 	AST_AUDIOHOOK_STATUS_SHUTDOWN, /*!< Audiohook is being shutdown */ 	AST_AUDIOHOOK_STATUS_DONE,     /*!< Audiohook has shutdown and is not running on a channel any longer */+	AST_AUDIOHOOK_STATUS_INACTIVE, /*!< Audiohook is attached to a channel but we want to ignore its presence */ };  enum ast_audiohook_direction {@@ -136,6 +137,18 @@  */ int ast_audiohook_attach(struct ast_channel *chan, struct ast_audiohook *audiohook); +/*! \brief Deactivate an attached audiohook+ * \param audiohook Audiohook structure+ * \return Returns 0 on success, -1 on failure+ */+int ast_audiohook_deactivate(struct ast_audiohook *audiohook);++/*! \brief Reactivate a deactivated attached audiohook+ * \param audiohook Audiohook structure+ * \return Returns 0 on success, -1 on failure+ */+int ast_audiohook_reactivate(struct ast_audiohook *audiohook);+ /*! \brief Detach audiohook from channel  * \param audiohook Audiohook structure  * \return Returns 0 on success, -1 on failureIndex: main/audiohook.c===================================================================--- main/audiohook.c	(revision 115587)+++ main/audiohook.c	(working copy)@@ -455,6 +455,24 @@ 	return (audiohook ? 0 : -1); } +int ast_audiohook_deactivate(struct ast_audiohook *audiohook)+{+	if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING)+		return -1;++	audiohook->status = AST_AUDIOHOOK_STATUS_INACTIVE;+	return 0;+}++int ast_audiohook_reactivate(struct ast_audiohook *audiohook)+{+	if (audiohook->status != AST_AUDIOHOOK_STATUS_INACTIVE)+		return -1;++	audiohook->status = AST_AUDIOHOOK_STATUS_RUNNING;+	return 0;+}+ /*!  * \brief Remove an audiohook from a specified channel  *@@ -504,7 +522,8 @@  	AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->manipulate_list, audiohook, list) { 		ast_audiohook_lock(audiohook);-		if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {+		if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING && +			audiohook->status != AST_AUDIOHOOK_STATUS_INACTIVE) { 			AST_LIST_REMOVE_CURRENT(list); 			audiohook->status = AST_AUDIOHOOK_STATUS_DONE; 			ast_audiohook_unlock(audiohook);@@ -551,14 +570,16 @@ 	/* Queue up signed linear frame to each spy */ 	AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->spy_list, audiohook, list) { 		ast_audiohook_lock(audiohook);-		if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {+		if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING && +			audiohook->status != AST_AUDIOHOOK_STATUS_INACTIVE) { 			AST_LIST_REMOVE_CURRENT(list); 			audiohook->status = AST_AUDIOHOOK_STATUS_DONE; 			ast_cond_signal(&audiohook->trigger); 			ast_audiohook_unlock(audiohook); 			continue; 		}-		ast_audiohook_write_frame(audiohook, direction, middle_frame);+		if (audiohook->status == AST_AUDIOHOOK_STATUS_RUNNING)+			ast_audiohook_write_frame(audiohook, direction, middle_frame); 		ast_audiohook_unlock(audiohook); 	} 	AST_LIST_TRAVERSE_SAFE_END@@ -570,14 +591,15 @@ 		memset(&combine_buf, 0, sizeof(combine_buf)); 		AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->whisper_list, audiohook, list) { 			ast_audiohook_lock(audiohook);-			if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {+			if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING && +				audiohook->status != AST_AUDIOHOOK_STATUS_INACTIVE) { 				AST_LIST_REMOVE_CURRENT(list); 				audiohook->status = AST_AUDIOHOOK_STATUS_DONE; 				ast_cond_signal(&audiohook->trigger); 				ast_audiohook_unlock(audiohook); 				continue; 			}-			if (ast_slinfactory_available(&audiohook->write_factory) >= samples && ast_slinfactory_read(&audiohook->write_factory, read_buf, samples)) {+			if (audiohook->status == AST_AUDIOHOOK_STATUS_RUNNING && ast_slinfactory_available(&audiohook->write_factory) >= samples && ast_slinfactory_read(&audiohook->write_factory, read_buf, samples)) { 				/* Take audio from this whisper source and combine it into our main buffer */ 				for (i = 0, data1 = combine_buf, data2 = read_buf; i < samples; i++, data1++, data2++) 					ast_slinear_saturated_add(data1, data2);@@ -595,7 +617,8 @@ 	if (!AST_LIST_EMPTY(&audiohook_list->manipulate_list)) { 		AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->manipulate_list, audiohook, list) { 			ast_audiohook_lock(audiohook);-			if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {+			if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING && +				audiohook->status != AST_AUDIOHOOK_STATUS_INACTIVE) { 				AST_LIST_REMOVE_CURRENT(list); 				audiohook->status = AST_AUDIOHOOK_STATUS_DONE; 				ast_audiohook_unlock(audiohook);@@ -604,7 +627,8 @@ 				continue; 			} 			/* Feed in frame to manipulation */-			audiohook->manipulate_callback(audiohook, chan, middle_frame, direction);+			if (audiohook->status == AST_AUDIOHOOK_STATUS_RUNNING)+				audiohook->manipulate_callback(audiohook, chan, middle_frame, direction); 			ast_audiohook_unlock(audiohook); 		} 		AST_LIST_TRAVERSE_SAFE_END