Replace ast_say_* functionn with function pointers, so that modules
[asterisk/asterisk.git] / include / asterisk / say.h
old mode 100755 (executable)
new mode 100644 (file)
index cc691bd..6c2396f
@@ -1,21 +1,30 @@
 /*
- * Asterisk -- A telephony toolkit for Linux.
+ * Asterisk -- An open source telephony toolkit.
  *
- * Say numbers and dates (maybe words one day too)
- * 
- * Copyright (C) 1999, Mark Spencer
+ * Copyright (C) 1999 - 2005, Digium, Inc.
  *
- * Mark Spencer <markster@linux-support.net>
+ * Mark Spencer <markster@digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
  *
  * This program is free software, distributed under the terms of
- * the GNU General Public License
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ * \brief Say numbers and dates (maybe words one day too)
  */
 
 #ifndef _ASTERISK_SAY_H
 #define _ASTERISK_SAY_H
 
-#include <asterisk/channel.h>
-#include <asterisk/file.h>
+#include "asterisk/channel.h"
+#include "asterisk/file.h"
 
 #include <time.h>
 
 extern "C" {
 #endif
 
-//! says a number
-/*! 
+/*! \brief
+ * All ast_say_* functions are implemented as function pointers,
+ * initialized to the function say_stub() which simply returns an error.
+ * An implementation of these functions (e.g. say.c, if available, or
+ * a dynamically loaded module) will just have to reassign the pointers
+ * to the relevant functions to override the previous implementation.
+ * As the conversion from the old implementation of say.c to the new
+ * implementation will be completed, and the API suitably reworked by
+ * removing redundant functions and/or arguments, this mechanism may be
+ * reverted back to pure static functions, if needed.
+ */
+#if defined(SAY_STUBS)
+/* provide declarations for the *say*() functions
+ * and initialize them to the stub function
+ */
+static int say_stub(struct ast_channel *chan, ...)
+{
+       ast_log(LOG_WARNING, "no implementation for the say() functions\n");
+        return -1;
+};
+
+#undef SAY_STUBS
+#define        SAY_INIT(x)      = (typeof (x))say_stub
+#define        SAY_EXTERN
+#else
+#define SAY_INIT(x)
+#define        SAY_EXTERN      extern
+#endif
+
+/* says a number
  * \param chan channel to say them number on
  * \param num number to say on the channel
  * \param ints which dtmf to interrupt on
  * \param lang language to speak the number
- * \param options set to 'f' for female, 'm' for masculine (used in portuguese)
+ * \param options set to 'f' for female, 'm' for male, 'c' for commune, 'n' for neuter, 'p' for plural
  * Vocally says a number on a given channel
  * Returns 0 on success, DTMF digit on interrupt, -1 on failure
  */
-int ast_say_number(struct ast_channel *chan, int num, char *ints, char *lang, char *options);
+SAY_EXTERN int (*ast_say_number)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options) SAY_INIT(ast_say_number);
 
 /* Same as above with audiofd for received audio and returns 1 on ctrlfd being readable */
-int ast_say_number_full(struct ast_channel *chan, int num, char *ints, char *lang, int audiofd, int ctrlfd);
+SAY_EXTERN int (* ast_say_number_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_number_full);
 
-//! says digits
-/*!
+/* says an enumeration
+ * \param chan channel to say them enumeration on
+ * \param num number to say on the channel
+ * \param ints which dtmf to interrupt on
+ * \param lang language to speak the enumeration
+ * \param options set to 'f' for female, 'm' for male, 'c' for commune, 'n' for neuter, 'p' for plural
+ * Vocally says a enumeration on a given channel (first, sencond, third, forth, thirtyfirst, hundredth, ....) 
+ * especially useful for dates and messages. says 'last' if num equals to INT_MAX
+ * Returns 0 on success, DTMF digit on interrupt, -1 on failure
+ */
+SAY_EXTERN int (* ast_say_enumeration)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options) SAY_INIT(ast_say_enumeration);
+SAY_EXTERN int (* ast_say_enumeration_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_enumeration_full);
+
+/* says digits
  * \param chan channel to act upon
  * \param num number to speak
  * \param ints which dtmf to interrupt on
@@ -47,11 +96,10 @@ int ast_say_number_full(struct ast_channel *chan, int num, char *ints, char *lan
  * Vocally says digits of a given number
  * Returns 0 on success, dtmf if interrupted, -1 on failure
  */
-int ast_say_digits(struct ast_channel *chan, int num, char *ints, char *lang);
-int ast_say_digits_full(struct ast_channel *chan, int num, char *ints, char *lang, int audiofd, int ctrlfd);
+SAY_EXTERN int (*ast_say_digits)(struct ast_channel *chan, int num, const char *ints, const char *lang) SAY_INIT(ast_say_digits);
+SAY_EXTERN int (*ast_say_digits_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_digits_full);
 
-//! says digits of a string
-/*! 
+/* says digits of a string
  * \param chan channel to act upon
  * \param num string to speak
  * \param ints which dtmf to interrupt on
@@ -59,25 +107,30 @@ int ast_say_digits_full(struct ast_channel *chan, int num, char *ints, char *lan
  * Vocally says the digits of a given string
  * Returns 0 on success, dtmf if interrupted, -1 on failure
  */
-int ast_say_digit_str(struct ast_channel *chan, char *num, char *ints, char *lang);
-int ast_say_digit_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
-int ast_say_character_str(struct ast_channel *chan, char *num, char *ints, char *lang);
-int ast_say_character_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
-int ast_say_phonetic_str(struct ast_channel *chan, char *num, char *ints, char *lang);
-int ast_say_phonetic_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
+SAY_EXTERN int (* ast_say_digit_str)(struct ast_channel *chan, const char *num, const char *ints, const char *lang) SAY_INIT(ast_say_digit_str);
+SAY_EXTERN int (* ast_say_digit_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_digit_str_full);
 
-int ast_say_datetime(struct ast_channel *chan, time_t t, char *ints, char *lang);
+/*
+ * the generic 'say' routine, with the first chars in the string
+ * defining the format to use
+ */
+SAY_EXTERN int (* ast_say_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_full);
+SAY_EXTERN int (* ast_say_character_str)(struct ast_channel *chan, const char *num, const char *ints, const char *lang) SAY_INIT(ast_say_character_str);
+SAY_EXTERN int (* ast_say_character_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_character_str_full);
+SAY_EXTERN int (* ast_say_phonetic_str)(struct ast_channel *chan, const char *num, const char *ints, const char *lang) SAY_INIT(ast_say_phonetic_str);
+SAY_EXTERN int (* ast_say_phonetic_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_phonetic_str_full);
 
-int ast_say_time(struct ast_channel *chan, time_t t, char *ints, char *lang);
+SAY_EXTERN int (* ast_say_datetime)(struct ast_channel *chan, time_t t, const char *ints, const char *lang) SAY_INIT(ast_say_datetime);
+SAY_EXTERN int (* ast_say_time)(struct ast_channel *chan, time_t t, const char *ints, const char *lang) SAY_INIT(ast_say_time);
 
-int ast_say_date(struct ast_channel *chan, time_t t, char *ints, char *lang);
+SAY_EXTERN int (* ast_say_date)(struct ast_channel *chan, time_t t, const char *ints, const char *lang) SAY_INIT(ast_say_date);
 
-int ast_say_datetime_from_now(struct ast_channel *chan, time_t t, char *ints, char *lang);
+SAY_EXTERN int (* ast_say_datetime_from_now)(struct ast_channel *chan, time_t t, const char *ints, const char *lang) SAY_INIT(ast_say_datetime_from_now);
 
-int ast_say_date_with_format(struct ast_channel *chan, time_t t, char *ints, char *lang, char *format, char *timezone);
+SAY_EXTERN int (* ast_say_date_with_format)(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *timezone) SAY_INIT(ast_say_date_with_format);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif
 
-#endif
+#endif /* _ASTERISK_SAY_H */