Make music on hold truly optional (bug #2998)
authorMark Spencer <markster@digium.com>
Thu, 9 Dec 2004 19:55:01 +0000 (19:55 +0000)
committerMark Spencer <markster@digium.com>
Thu, 9 Dec 2004 19:55:01 +0000 (19:55 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4411 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channel.c
include/asterisk/musiconhold.h
res/res_musiconhold.c

index 3964565..dca5297 100755 (executable)
--- a/channel.c
+++ b/channel.c
@@ -24,6 +24,7 @@
 #include <asterisk/sched.h>
 #include <asterisk/options.h>
 #include <asterisk/channel.h>
+#include <asterisk/musiconhold.h>
 #include <asterisk/channel_pvt.h>
 #include <asterisk/logger.h>
 #include <asterisk/say.h>
@@ -2959,3 +2960,40 @@ unsigned int ast_get_group(char *s)
        }
        return group;
 }
+
+
+static int (*ast_moh_start_ptr)(struct ast_channel *, char *) = NULL;
+static void (*ast_moh_stop_ptr)(struct ast_channel *) = NULL;
+
+
+void ast_install_music_functions(int (*start_ptr)(struct ast_channel *, char *),
+                                                               void (*stop_ptr)(struct ast_channel *)) 
+{
+       ast_moh_start_ptr = start_ptr;
+       ast_moh_stop_ptr = stop_ptr;
+}
+
+void ast_uninstall_music_functions(void) 
+{
+       ast_moh_start_ptr = NULL;
+       ast_moh_stop_ptr = NULL;
+}
+
+/*! Turn on/off music on hold on a given channel */
+
+int ast_moh_start(struct ast_channel *chan, char *mclass) 
+{
+       if(ast_moh_start_ptr)
+               return ast_moh_start_ptr(chan, mclass);
+
+       if (option_verbose > 2)
+               ast_verbose(VERBOSE_PREFIX_3 "Music class %s requested but no musiconhold loaded.\n", mclass ? mclass : "default");
+       
+       return 0;
+}
+
+void ast_moh_stop(struct ast_channel *chan) 
+{
+       if(ast_moh_stop_ptr)
+               ast_moh_stop_ptr(chan);
+}
index ceef76c..39c90bd 100755 (executable)
@@ -24,6 +24,10 @@ extern int ast_moh_start(struct ast_channel *chan, char *mclass);
 /*! Turn off music on hold on a given channel */
 extern void ast_moh_stop(struct ast_channel *chan);
 
+extern void ast_install_music_functions(int (*start_ptr)(struct ast_channel *, char *),
+                                                                void (*stop_ptr)(struct ast_channel *));
+extern void ast_uninstall_music_functions(void);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif
index e3808da..53d25f3 100755 (executable)
@@ -588,7 +588,7 @@ static int moh_register(char *classname, char *mode, char *param, char *miscargs
        return 0;
 }
 
-int ast_moh_start(struct ast_channel *chan, char *class)
+static int local_ast_moh_start(struct ast_channel *chan, char *class)
 {
        if (!class || ast_strlen_zero(class))
                class = chan->musicclass;
@@ -597,7 +597,7 @@ int ast_moh_start(struct ast_channel *chan, char *class)
        return ast_activate_generator(chan, &mohgen, class);
 }
 
-void ast_moh_stop(struct ast_channel *chan)
+static void local_ast_moh_stop(struct ast_channel *chan)
 {
        ast_deactivate_generator(chan);
 }
@@ -659,6 +659,7 @@ int load_module(void)
 {
        int res;
        load_moh_classes();
+       ast_install_music_functions(local_ast_moh_start, local_ast_moh_stop);
        res = ast_register_application(app0, moh0_exec, synopsis0, descrip0);
        ast_register_atexit(ast_moh_destroy);
        if (!res)