install speex_types.h when doing "make install"
[speexdsp.git] / libspeex / modes_noglobals.c
index a88035b..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;
 
@@ -298,7 +316,7 @@ static const ltp_params * ltp_params_nb (void)
    7,
    7
    );
-};
+}
 
 /* Parameters for Long-Term Prediction (LTP)*/
 static const ltp_params * ltp_params_vlbr (void)
@@ -308,7 +326,7 @@ static const ltp_params * ltp_params_vlbr (void)
    5,
    0
    );
-};
+}
 
 /* Parameters for Long-Term Prediction (LTP)*/
 static const ltp_params * ltp_params_lbr (void)
@@ -318,7 +336,7 @@ static const ltp_params * ltp_params_lbr (void)
    5,
    7
    );
-};
+}
 
 /* Parameters for Long-Term Prediction (LTP)*/
 static const ltp_params * ltp_params_med (void)
@@ -328,7 +346,7 @@ static const ltp_params * ltp_params_med (void)
    5,
    7
    );
-};
+}
 
 /* Split-VQ innovation parameters for very low bit-rate narrowband */
 static const split_cb_params * split_cb_nb_vlbr (void)
@@ -340,7 +358,7 @@ static const split_cb_params * split_cb_nb_vlbr (void)
    4,               /*shape_bits*/
    0
    );
-};
+}
 
 /* Split-VQ innovation parameters for very low bit-rate narrowband */
 static const split_cb_params * split_cb_nb_ulbr (void)
@@ -352,7 +370,7 @@ static const split_cb_params * split_cb_nb_ulbr (void)
    5,               /*shape_bits*/
    0
    );
-};
+}
 
 /* Split-VQ innovation parameters for low bit-rate narrowband */
 static const split_cb_params * split_cb_nb_lbr (void)
@@ -364,7 +382,7 @@ static const split_cb_params * split_cb_nb_lbr (void)
    5,               /*shape_bits*/
    0
    );
-};
+}
 
 
 /* Split-VQ innovation parameters narrowband */
@@ -377,7 +395,7 @@ static const split_cb_params * split_cb_nb (void)
    6,               /*shape_bits*/
    0
    );
-};
+}
 
 /* Split-VQ innovation parameters narrowband */
 static const split_cb_params * split_cb_nb_med (void)
@@ -389,7 +407,7 @@ static const split_cb_params * split_cb_nb_med (void)
    7,               /*shape_bits*/
    0
    );
-};
+}
 
 /* Split-VQ innovation for low-band wideband */
 static const split_cb_params * split_cb_sb (void)
@@ -401,7 +419,7 @@ static const split_cb_params * split_cb_sb (void)
    8,               /*shape_bits*/
    0
    );
-};
+}
 
 /* Split-VQ innovation for high-band wideband */
 static const split_cb_params * split_cb_high (void)
@@ -413,7 +431,7 @@ static const split_cb_params * split_cb_high (void)
    7,               /*shape_bits*/
    1
    );
-};
+}
 
 
 /* Split-VQ innovation for high-band wideband */
@@ -426,7 +444,7 @@ static const split_cb_params * split_cb_high_lbr (void)
    5,               /*shape_bits*/
    0
    );
-};
+}
 
 /* 2150 bps "vocoder-like" mode for comfort noise */
 static const SpeexSubmode * nb_submode1 (void)
@@ -454,7 +472,7 @@ static const SpeexSubmode * nb_submode1 (void)
 #endif
    43
    );
-};
+}
 
 /* 3.95 kbps very low bit-rate mode */
 static const SpeexSubmode * nb_submode8 (void)
@@ -487,7 +505,7 @@ static const SpeexSubmode * nb_submode8 (void)
 #endif
    79
    );
-};
+}
 
 /* 5.95 kbps very low bit-rate mode */
 static const SpeexSubmode * nb_submode2 (void)
@@ -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,
@@ -515,7 +533,7 @@ static const SpeexSubmode * nb_submode2 (void)
 #endif
    119
    );
-};
+}
 
 /* 8 kbps low bit-rate mode */
 static const SpeexSubmode * nb_submode3 (void)
@@ -543,7 +561,7 @@ static const SpeexSubmode * nb_submode3 (void)
 #endif
    160
    );
-};
+}
 
 /* 11 kbps medium bit-rate mode */
 static const SpeexSubmode * nb_submode4 (void)
@@ -571,7 +589,7 @@ static const SpeexSubmode * nb_submode4 (void)
 #endif
    220
    );
-};
+}
 
 /* 15 kbps high bit-rate mode */
 static const SpeexSubmode * nb_submode5 (void)
@@ -599,7 +617,7 @@ static const SpeexSubmode * nb_submode5 (void)
 #endif
    300
    );
-};
+}
 
 /* 18.2 high bit-rate mode */
 static const SpeexSubmode * nb_submode6 (void)
@@ -627,7 +645,7 @@ static const SpeexSubmode * nb_submode6 (void)
 #endif
    364
    );
-};
+}
 
 /* 24.6 kbps high bit-rate mode */
 static const SpeexSubmode * nb_submode7 (void)
@@ -655,7 +673,7 @@ static const SpeexSubmode * nb_submode7 (void)
 #endif
    492
    );
-};
+}
 
 
 /* Default mode for narrowband */
@@ -664,7 +682,6 @@ static const SpeexNBMode * nb_mode (void)
   const SpeexSubmode ** submodes;
   int quality_map[11] = {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7};
   const SpeexNBMode * ret;
-  int i;
 
   submodes = (const SpeexSubmode **)
     speex_alloc (sizeof (SpeexSubmode *) * SB_SUBMODES);
@@ -707,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;
 
@@ -721,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",
@@ -750,9 +767,9 @@ const SpeexMode * speex_nb_mode_new (void)
    &nb_encoder_ctl,
    &nb_decoder_ctl
    );
-};
+}
 
-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);
@@ -785,7 +802,7 @@ static const SpeexSubmode * wb_submode1 (void)
 #endif
    36
    );
-};
+}
 
 
 static const SpeexSubmode * wb_submode2 (void)
@@ -813,7 +830,7 @@ static const SpeexSubmode * wb_submode2 (void)
 #endif
    112
    );
-};
+}
 
 
 static const SpeexSubmode * wb_submode3 (void)
@@ -842,7 +859,7 @@ static const SpeexSubmode * wb_submode3 (void)
 #endif
    192
    );
-};
+}
 
 static const SpeexSubmode * wb_submode4 (void)
 {
@@ -869,7 +886,7 @@ static const SpeexSubmode * wb_submode4 (void)
 #endif
    352
    );
-};
+}
 
 
 /* Split-band wideband CELP mode*/
@@ -921,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;
 
@@ -931,10 +948,10 @@ 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;
-};
+}
 
 static void
 sb_wb_mode_free (const SpeexSBMode * mode)
@@ -942,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)",
@@ -964,9 +981,9 @@ const SpeexMode * speex_wb_mode_new (void)
    &sb_encoder_ctl,
    &sb_decoder_ctl
    );
-};
+}
 
-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);
@@ -1023,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)",
@@ -1062,17 +1079,17 @@ const SpeexMode * speex_uwb_mode_new (void)
    &sb_encoder_ctl,
    &sb_decoder_ctl
    );
-};
+}
 
-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;
@@ -1080,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;