[asterisk-commits] kpfleming: trunk r174705 - in /trunk: include/asterisk/ main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Feb 10 13:38:26 CST 2009


Author: kpfleming
Date: Tue Feb 10 13:38:26 2009
New Revision: 174705

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=174705
Log:
improve slinfactory API to remove implicit sample rate and require explicit sample rate selection by creator of the slinfactory


Modified:
    trunk/include/asterisk/slinfactory.h
    trunk/main/slinfactory.c

Modified: trunk/include/asterisk/slinfactory.h
URL: http://svn.digium.com/svn-view/asterisk/trunk/include/asterisk/slinfactory.h?view=diff&rev=174705&r1=174704&r2=174705
==============================================================================
--- trunk/include/asterisk/slinfactory.h (original)
+++ trunk/include/asterisk/slinfactory.h Tue Feb 10 13:38:26 2009
@@ -38,16 +38,27 @@
 	size_t holdlen;                          /*!< Number of samples currently in the hold */
 	unsigned int size;                       /*!< Number of samples currently in the factory */
 	unsigned int format;                     /*!< Current format the translation path is converting from */
+	unsigned int output_format;		 /*!< The output format desired */
 };
 
 /*!
- * \brief Initialize an slinfactory
+ * \brief Initialize a slinfactory
  *
  * \param sf The slinfactory to initialize
  *
  * \return Nothing
  */
 void ast_slinfactory_init(struct ast_slinfactory *sf);
+
+/*!
+ * \brief Initialize a slinfactory
+ *
+ * \param sf The slinfactory to initialize
+ * \param sample_rate The output sample rate desired
+ *
+ * \return 0 on success, non-zero on failure
+ */
+int ast_slinfactory_init_rate(struct ast_slinfactory *sf, unsigned int sample_rate);
 
 /*!
  * \brief Destroy the contents of a slinfactory
@@ -63,7 +74,7 @@
 void ast_slinfactory_destroy(struct ast_slinfactory *sf);
 
 /*!
- * \brief Feed audio into an slinfactory
+ * \brief Feed audio into a slinfactory
  *
  * \param sf The slinfactory to feed into
  * \param f Frame containing audio to feed in
@@ -73,7 +84,7 @@
 int ast_slinfactory_feed(struct ast_slinfactory *sf, struct ast_frame *f);
 
 /*!
- * \brief Read samples from an slinfactory
+ * \brief Read samples from a slinfactory
  *
  * \param sf The slinfactory to read from
  * \param buf Buffer to put samples into
@@ -84,7 +95,7 @@
 int ast_slinfactory_read(struct ast_slinfactory *sf, short *buf, size_t samples);
 
 /*!
- * \brief Retrieve number of samples currently in an slinfactory
+ * \brief Retrieve number of samples currently in a slinfactory
  *
  * \param sf The slinfactory to peek into
  *
@@ -93,7 +104,7 @@
 unsigned int ast_slinfactory_available(const struct ast_slinfactory *sf);
 
 /*!
- * \brief Flush the contents of an slinfactory
+ * \brief Flush the contents of a slinfactory
  *
  * \param sf The slinfactory to flush
  *

Modified: trunk/main/slinfactory.c
URL: http://svn.digium.com/svn-view/asterisk/trunk/main/slinfactory.c?view=diff&rev=174705&r1=174704&r2=174705
==============================================================================
--- trunk/main/slinfactory.c (original)
+++ trunk/main/slinfactory.c Tue Feb 10 13:38:26 2009
@@ -32,30 +32,31 @@
 #include "asterisk/slinfactory.h"
 #include "asterisk/translate.h"
 
-/*!
- * \brief Initialize an slinfactory
- *
- * \arg sf The slinfactory to initialize
- *
- * \return Nothing
- */
 void ast_slinfactory_init(struct ast_slinfactory *sf) 
 {
 	memset(sf, 0, sizeof(*sf));
 	sf->offset = sf->hold;
-}
-
-/*!
- * \brief Destroy the contents of a slinfactory
- *
- * \arg sf The slinfactory that is no longer needed
- *
- * This function will free any memory allocated for the contents of the
- * slinfactory.  It does not free the slinfactory itself.  If the sf is
- * malloc'd, then it must be explicitly free'd after calling this function.
- *
- * \return Nothing
- */
+	sf->output_format = AST_FORMAT_SLINEAR;
+}
+
+int ast_slinfactory_init_rate(struct ast_slinfactory *sf, unsigned int sample_rate) 
+{
+	memset(sf, 0, sizeof(*sf));
+	sf->offset = sf->hold;
+	switch (sample_rate) {
+	case 8000:
+		sf->output_format = AST_FORMAT_SLINEAR;
+		break;
+	case 16000:
+		sf->output_format = AST_FORMAT_SLINEAR16;
+		break;
+	default:
+		return -1;
+	}
+
+	return 0;
+}
+
 void ast_slinfactory_destroy(struct ast_slinfactory *sf) 
 {
 	struct ast_frame *f;
@@ -69,14 +70,6 @@
 		ast_frfree(f);
 }
 
-/*!
- * \brief Feed audio into an slinfactory
- *
- * \arg sf The slinfactory to feed into
- * \arg f Frame containing audio to feed in
- *
- * \return Number of frames currently in factory
- */
 int ast_slinfactory_feed(struct ast_slinfactory *sf, struct ast_frame *f)
 {
 	struct ast_frame *begin_frame = f, *duped_frame = NULL, *frame_ptr;
@@ -92,15 +85,16 @@
 		return 0;
 	}
 
-	if (f->subclass != AST_FORMAT_SLINEAR && f->subclass != AST_FORMAT_SLINEAR16) {
+	if (f->subclass != sf->output_format) {
 		if (sf->trans && f->subclass != sf->format) {
 			ast_translator_free_path(sf->trans);
 			sf->trans = NULL;
 		}
 
 		if (!sf->trans) {
-			if (!(sf->trans = ast_translator_build_path((f->subclass == AST_FORMAT_G722 ? AST_FORMAT_SLINEAR16 : AST_FORMAT_SLINEAR), f->subclass))) {
-				ast_log(LOG_WARNING, "Cannot build a path from %s to slin\n", ast_getformatname(f->subclass));
+			if (!(sf->trans = ast_translator_build_path(sf->output_format, f->subclass))) {
+				ast_log(LOG_WARNING, "Cannot build a path from %s to %s\n", ast_getformatname(f->subclass),
+					ast_getformatname(sf->output_format));
 				return 0;
 			}
 			sf->format = f->subclass;
@@ -125,8 +119,9 @@
 	}
 
 	x = 0;
-	AST_LIST_TRAVERSE(&sf->queue, frame_ptr, frame_list)
+	AST_LIST_TRAVERSE(&sf->queue, frame_ptr, frame_list) {
 		x++;
+	}
 
 	AST_LIST_INSERT_TAIL(&sf->queue, duped_frame, frame_list);
 
@@ -135,15 +130,6 @@
 	return x;
 }
 
-/*!
- * \brief Read samples from an slinfactory
- *
- * \arg sf The slinfactory to read from
- * \arg buf Buffer to put samples into
- * \arg samples Number of samples wanted
- *
- * \return Number of samples read
- */
 int ast_slinfactory_read(struct ast_slinfactory *sf, short *buf, size_t samples) 
 {
 	struct ast_frame *frame_ptr;
@@ -198,25 +184,11 @@
 	return sofar;
 }
 
-/*!
- * \brief Retrieve number of samples currently in an slinfactory
- *
- * \arg sf The slinfactory to peek into
- *
- * \return Number of samples in slinfactory
- */
 unsigned int ast_slinfactory_available(const struct ast_slinfactory *sf)
 {
 	return sf->size;
 }
 
-/*!
- * \brief Flush the contents of an slinfactory
- *
- * \arg sf The slinfactory to flush
- *
- * \return Nothing
- */
 void ast_slinfactory_flush(struct ast_slinfactory *sf)
 {
 	struct ast_frame *fr = NULL;




More information about the asterisk-commits mailing list