Merged revisions 135841,135847,135850 via svnmerge from
[asterisk/asterisk.git] / main / abstract_jb.c
index 4b04279..4d47044 100644 (file)
@@ -67,7 +67,8 @@ typedef long (*jb_next_impl)(void *jb);
 typedef int (*jb_remove_impl)(void *jb, struct ast_frame **fout);
 /*! \brief Force resynch */
 typedef void (*jb_force_resynch_impl)(void *jb);
-
+/*! \brief Empty and reset jb */
+typedef void (*jb_empty_and_reset_impl)(void *jb);
 
 /*!
  * \brief Jitterbuffer implementation private struct.
@@ -83,6 +84,7 @@ struct ast_jb_impl
        jb_next_impl next;
        jb_remove_impl remove;
        jb_force_resynch_impl force_resync;
+       jb_empty_and_reset_impl empty_and_reset;
 };
 
 /* Implementation functions */
@@ -95,6 +97,7 @@ static int jb_get_fixed(void *jb, struct ast_frame **fout, long now, long interp
 static long jb_next_fixed(void *jb);
 static int jb_remove_fixed(void *jb, struct ast_frame **fout);
 static void jb_force_resynch_fixed(void *jb);
+static void jb_empty_and_reset_fixed(void *jb);
 /* adaptive */
 static void * jb_create_adaptive(struct ast_jb_conf *general_config, long resynch_threshold);
 static void jb_destroy_adaptive(void *jb);
@@ -104,6 +107,7 @@ static int jb_get_adaptive(void *jb, struct ast_frame **fout, long now, long int
 static long jb_next_adaptive(void *jb);
 static int jb_remove_adaptive(void *jb, struct ast_frame **fout);
 static void jb_force_resynch_adaptive(void *jb);
+static void jb_empty_and_reset_adaptive(void *jb);
 
 /* Available jb implementations */
 static struct ast_jb_impl avail_impl[] = 
@@ -117,7 +121,8 @@ static struct ast_jb_impl avail_impl[] =
                .get = jb_get_fixed,
                .next = jb_next_fixed,
                .remove = jb_remove_fixed,
-               .force_resync = jb_force_resynch_fixed
+               .force_resync = jb_force_resynch_fixed,
+               .empty_and_reset = jb_empty_and_reset_fixed,
        },
        {
                .name = "adaptive",
@@ -128,7 +133,8 @@ static struct ast_jb_impl avail_impl[] =
                .get = jb_get_adaptive,
                .next = jb_next_adaptive,
                .remove = jb_remove_adaptive,
-               .force_resync = jb_force_resynch_adaptive
+               .force_resync = jb_force_resynch_adaptive,
+               .empty_and_reset = jb_empty_and_reset_adaptive,
        }
 };
 
@@ -223,7 +229,7 @@ int ast_jb_do_usecheck(struct ast_channel *c0, struct ast_channel *c1)
                        }
                        ast_set_flag(jb0, JB_TIMEBASE_INITIALIZED);
                }
-               
+       
                if (!c0_jb_created) {
                        jb_choose_impl(c0);
                }
@@ -603,22 +609,37 @@ void ast_jb_get_config(const struct ast_channel *chan, struct ast_jb_conf *conf)
        memcpy(conf, &chan->jb.conf, sizeof(*conf));
 }
 
+void ast_jb_empty_and_reset(struct ast_channel *c0, struct ast_channel *c1)
+{
+       struct ast_jb *jb0 = &c0->jb;
+       struct ast_jb *jb1 = &c1->jb;
+       int c0_use_jb = ast_test_flag(jb0, JB_USE);
+       int c0_jb_is_created = ast_test_flag(jb0, JB_CREATED);
+       int c1_use_jb = ast_test_flag(jb1, JB_USE);
+       int c1_jb_is_created = ast_test_flag(jb1, JB_CREATED);
+
+       if (c0_use_jb && c0_jb_is_created && jb0->impl->empty_and_reset) {
+               jb0->impl->empty_and_reset(jb0->jbobj);
+       }
+
+       if (c1_use_jb && c1_jb_is_created && jb1->impl->empty_and_reset) {
+               jb1->impl->empty_and_reset(jb1->jbobj);
+       }
+}
 
 /* Implementation functions */
 
 /* fixed */
-
 static void * jb_create_fixed(struct ast_jb_conf *general_config, long resynch_threshold)
 {
        struct fixed_jb_conf conf;
-       
+
        conf.jbsize = general_config->max_size;
        conf.resync_threshold = resynch_threshold;
-       
+
        return fixed_jb_new(&conf);
 }
 
-
 static void jb_destroy_fixed(void *jb)
 {
        struct fixed_jb *fixedjb = (struct fixed_jb *) jb;
@@ -691,6 +712,15 @@ static void jb_force_resynch_fixed(void *jb)
        fixed_jb_set_force_resynch(fixedjb);
 }
 
+static void jb_empty_and_reset_fixed(void *jb)
+{
+       struct fixed_jb *fixedjb = jb;
+       struct fixed_jb_frame f;
+
+       while (fixed_jb_remove(fixedjb, &f) == FIXED_JB_OK) {
+               ast_frfree(f.data);
+       }
+}
 
 /* adaptive */
 
@@ -773,3 +803,15 @@ static int jb_remove_adaptive(void *jb, struct ast_frame **fout)
 static void jb_force_resynch_adaptive(void *jb)
 {
 }
+
+static void jb_empty_and_reset_adaptive(void *jb)
+{
+       jitterbuf *adaptivejb = jb;
+       jb_frame f;
+
+       while (jb_getall(adaptivejb, &f) == JB_OK) {
+               ast_frfree(f.data);
+       }
+
+       jb_reset(adaptivejb);
+}