install speex_types.h when doing "make install"
[speexdsp.git] / libspeex / modes_noglobals.c
index da22d74..2126af1 100644 (file)
@@ -1,7 +1,14 @@
-/* Copyright (C) 2002 Jean-Marc Valin 
+/* Copyright (C) 2004 CSIRO Australia
    File: modes_noglobals.c
 
-   Describes the different modes of the codec
+   Hacked by Conrad Parker, based on modes.c:
+   Copyright (C) 2002 Jean-Marc Valin 
+
+   Describes the different modes of the codec. This file differs from
+   modes.c in that SpeexMode structures are dynamically allocated,
+   rather than being statically defined. This introduces some minor
+   API changes which are described in the file README.symbian in the
+   top level of the Speex source distribution.
 
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
 
 */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include "modes.h"
 #include "ltp.h"
 #include "quant_lsp.h"
@@ -41,6 +52,7 @@
 #include "vbr.h"
 #include "misc.h"
 #include <math.h>
+#include <string.h>
 
 #ifndef NULL
 #define NULL 0
@@ -75,9 +87,9 @@ speex_ltp_params_new (const signed char * gain_cdbk, int gain_bits,
 }
 
 static void
-speex_ltp_params_free (ltp_params * params)
+speex_ltp_params_free (const ltp_params * params)
 {
-  speex_free (params);
+  speex_free ((void *)params);
 }
 
 static const split_cb_params *
@@ -100,9 +112,9 @@ speex_split_cb_params_new (int subvect_size, int nb_subvect,
 }
 
 static void
-speex_split_cb_params_free (split_cb_params * params)
+speex_split_cb_params_free (const split_cb_params * params)
 {
-  speex_free (params);
+  speex_free ((void *)params);
 }
 
 static SpeexSubmode *
@@ -156,6 +168,12 @@ speex_submode_new (int lbr_pitch, int forced_pitch_gain,
 static void
 speex_submode_free (const SpeexSubmode * submode)
 {
+  if (submode->ltp_params)
+    speex_ltp_params_free (submode->ltp_params);
+
+  if (submode->innovation_params)
+    speex_split_cb_params_free (submode->innovation_params);
+
   speex_free ((void *)submode);
 }
 
@@ -217,7 +235,7 @@ sb_mode_new (
    int     defaultSubmode, /**< Default sub-mode to use when encoding */
    int     low_quality_map[], /**< Mode corresponding to each quality setting */
    int     quality_map[], /**< Mode corresponding to each quality setting */
-   float   (*vbr_thresh)[11],
+   const float (*vbr_thresh)[11],
    int     nb_modes
                   )
 {
@@ -259,12 +277,12 @@ sb_mode_free (const SpeexSBMode * sb_mode)
 }
 
 static SpeexMode *
-speex_mode_new (const void * b_mode, mode_query_func query, char * modeName,
-               int modeID, int bitstream_version, encoder_init_func enc_init,
-               encoder_destroy_func enc_destroy, encode_func enc,
-               decoder_init_func dec_init, decoder_destroy_func dec_destroy,
-               decode_func dec, encoder_ctl_func enc_ctl,
-               decoder_ctl_func dec_ctl)
+mode_new (const void * b_mode, mode_query_func query, char * modeName,
+         int modeID, int bitstream_version, encoder_init_func enc_init,
+         encoder_destroy_func enc_destroy, encode_func enc,
+         decoder_init_func dec_init, decoder_destroy_func dec_destroy,
+         decode_func dec, encoder_ctl_func enc_ctl,
+         decoder_ctl_func dec_ctl)
 {
   SpeexMode * mode;
 
@@ -503,7 +521,7 @@ static const SpeexSubmode * nb_submode2 (void)
    /*No pitch quantization*/
    pitch_search_3tap,
    pitch_unquant_3tap,
-   &ltp_params_vlbr,
+   ltp_params_vlbr(),
    /*Innovation quantization*/
    split_cb_search_shape_sign,
    split_cb_shape_sign_unquant,
@@ -706,7 +724,7 @@ static const SpeexNBMode * nb_mode (void)
   /* If nb_mode_new() was successful, the references to submodes have been
    * copied into ret->submodes[], and it's safe to free submodes.
    */
-  speex_free (submodes);
+  speex_free ((void *)submodes);
 
   return ret;
 
@@ -720,21 +738,21 @@ static const SpeexNBMode * nb_mode (void)
  nb_2: speex_submode_free (submodes[2]);
  nb_1: speex_submode_free (submodes[1]);
 
-  speex_free (submodes);
+  speex_free ((void *)submodes);
 
   return NULL;
 }
 
 
 /* Default mode for narrowband */
-const SpeexMode * speex_nb_mode_new (void)
+static const SpeexMode * speex_nb_mode_new (void)
 {
   const SpeexNBMode * _nb_mode;
 
   _nb_mode = nb_mode();
   if (_nb_mode == NULL) return NULL;
 
-  return speex_mode_new (
+  return mode_new (
    _nb_mode,
    nb_mode_query,
    "narrowband",
@@ -751,7 +769,7 @@ const SpeexMode * speex_nb_mode_new (void)
    );
 }
 
-void speex_nb_mode_free (const SpeexMode * mode)
+static void speex_nb_mode_free (const SpeexMode * mode)
 {
   nb_mode_free ((SpeexNBMode *)mode->mode);
   speex_free ((void *)mode);
@@ -920,7 +938,7 @@ static const SpeexSBMode * sb_wb_mode (void)
   /* If sb_mode_new() was successful, the references to submodes have been
    * copied into ret->submodes[], and it's safe to free submodes.
    */
-  speex_free (submodes);
+  speex_free ((void *)submodes);
 
   return ret;
 
@@ -930,7 +948,7 @@ static const SpeexSBMode * sb_wb_mode (void)
  sb_2: speex_submode_free (submodes[2]);
  sb_1: speex_submode_free (submodes[1]);
 
-  speex_free (submodes);
+  speex_free ((void *)submodes);
 
   return NULL;
 }
@@ -941,14 +959,14 @@ sb_wb_mode_free (const SpeexSBMode * mode)
   speex_nb_mode_free (mode->nb_mode);
 }
 
-const SpeexMode * speex_wb_mode_new (void)
+static const SpeexMode * speex_wb_mode_new (void)
 {
   const SpeexSBMode * sb_mode;
 
   sb_mode = sb_wb_mode ();
   if (sb_mode == NULL) return NULL;
 
-  return speex_mode_new (
+  return mode_new (
    (const SpeexNBMode *)sb_mode,
    wb_mode_query,
    "wideband (sub-band CELP)",
@@ -965,7 +983,7 @@ const SpeexMode * speex_wb_mode_new (void)
    );
 }
 
-void speex_wb_mode_free (const SpeexMode * mode)
+static void speex_wb_mode_free (const SpeexMode * mode)
 {
   sb_wb_mode_free (mode->mode);
   speex_free ((void *)mode);
@@ -1022,31 +1040,31 @@ static const SpeexSBMode * sb_uwb_mode (void)
   /* If sb_mode_new() was successful, the references to submodes have been
    * copied into ret->submodes[], and it's safe to free submodes.
    */
-  speex_free (submodes);
+  speex_free ((void *)submodes);
 
   return ret;
 
  uwb_1: speex_submode_free (submodes[1]);
 
-  speex_free (submodes);
+  speex_free ((void *)submodes);
 
   return NULL;
 }
 
-void sb_uwb_mode_free (const SpeexSBMode * mode)
+static void sb_uwb_mode_free (const SpeexSBMode * mode)
 {
   sb_wb_mode_free ((const SpeexSBMode *)mode->nb_mode);
   sb_mode_free (mode);
 }
 
-const SpeexMode * speex_uwb_mode_new (void)
+static const SpeexMode * speex_uwb_mode_new (void)
 {
   const SpeexSBMode * sb_mode;
 
   sb_mode = sb_uwb_mode();
   if (sb_mode == NULL) return NULL;
 
-  return speex_mode_new (
+  return mode_new (
    sb_mode,
    wb_mode_query,
    "ultra-wideband (sub-band CELP)",
@@ -1063,15 +1081,15 @@ const SpeexMode * speex_uwb_mode_new (void)
    );
 }
 
-void speex_uwb_mode_free (const SpeexMode * mode)
+static void speex_uwb_mode_free (const SpeexMode * mode)
 {
   sb_uwb_mode_free (mode->mode);
   speex_free ((void *)mode);
 }
 
-const SpeexMode * speex_mode_new_byID (int id)
+const SpeexMode * speex_mode_new (int modeID)
 {
-  switch (id) {
+  switch (modeID) {
   case 0: return speex_nb_mode_new(); break;
   case 1: return speex_wb_mode_new(); break;
   case 2: return speex_uwb_mode_new(); break;
@@ -1079,9 +1097,9 @@ const SpeexMode * speex_mode_new_byID (int id)
   }
 }
 
-void speex_mode_free_byID (SpeexMode * mode, int id)
+void speex_mode_destroy (const SpeexMode * mode)
 {
-  switch (id) {
+  switch (mode->modeID) {
   case 0: speex_nb_mode_free(mode); break;
   case 1: speex_wb_mode_free(mode); break;
   case 2:  speex_uwb_mode_free(mode); break;