Allow the stack to be allocated with speex_alloc_scratch()
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 9 Jun 2005 05:09:53 +0000 (05:09 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 9 Jun 2005 05:09:53 +0000 (05:09 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@9413 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/misc.c
libspeex/misc.h
libspeex/nb_celp.c
libspeex/sb_celp.c

index 1e2d115..4b0223b 100644 (file)
@@ -131,6 +131,10 @@ void *speex_alloc (int size)
 {
    return calloc(size,1);
 }
+void *speex_alloc_scratch (int size)
+{
+   return calloc(size,1);
+}
 
 void *speex_realloc (void *ptr, int size)
 {
@@ -141,6 +145,10 @@ void speex_free (void *ptr)
 {
    free(ptr);
 }
+void speex_free_scratch (void *ptr)
+{
+   free(ptr);
+}
 
 #ifndef OVERRIDE_SPEEX_MOVE
 void *speex_move (void *dest, void *src, int n)
index 150d763..84dbe5a 100644 (file)
@@ -55,12 +55,18 @@ spx_uint32_t le_int(spx_uint32_t i);
 /** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_free */
 void *speex_alloc (int size);
 
+/** Same as speex_alloc, except that the area is only needed inside a Speex call (might cause problem with wideband though) */
+void *speex_alloc_scratch (int size);
+
 /** Speex wrapper for realloc. To do your own dynamic allocation, all you need to do is replace this function, speex_alloc and speex_free */
 void *speex_realloc (void *ptr, int size);
 
 /** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_alloc */
 void speex_free (void *ptr);
 
+/** Same as speex_alloc, except that the area is only needed inside a Speex call (might cause problem with wideband though) */
+void speex_free_scratch (void *ptr);
+
 /** Speex wrapper for mem_move */
 void *speex_move (void *dest, void *src, int n);
 
index 392d024..1f2bfac 100644 (file)
@@ -105,16 +105,13 @@ void *nb_encoder_init(const SpeexMode *m)
    int i;
 
    mode=(const SpeexNBMode *)m->mode;
-#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
    st = (EncState*)speex_alloc(sizeof(EncState));
    if (!st)
       return NULL;
+#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
    st->stack = NULL;
 #else
-   st = (EncState*)speex_alloc(sizeof(EncState)+NB_ENC_STACK);
-   if (!st)
-      return NULL;
-   st->stack = ((char*)st) + sizeof(EncState);
+   st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
 #endif
    
    st->mode=m;
@@ -221,6 +218,9 @@ void nb_encoder_destroy(void *state)
 {
    EncState *st=(EncState *)state;
    /* Free all allocated memory */
+#if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA))
+   speex_free_scratch(st->stack);
+#endif
 
    speex_free (st->inBuf);
    speex_free (st->excBuf);
@@ -975,16 +975,13 @@ void *nb_decoder_init(const SpeexMode *m)
    int i;
 
    mode=(const SpeexNBMode*)m->mode;
-#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
    st = (DecState *)speex_alloc(sizeof(DecState));
    if (!st)
       return NULL;
+#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
    st->stack = NULL;
 #else
-   st = (DecState *)speex_alloc(sizeof(DecState)+NB_DEC_STACK);
-   if (!st)
-      return NULL;
-   st->stack = ((char*)st) + sizeof(DecState);
+   st->stack = (char*)speex_alloc_scratch(NB_DEC_STACK);
 #endif
 
    st->mode=m;
@@ -1057,6 +1054,10 @@ void nb_decoder_destroy(void *state)
    DecState *st;
    st=(DecState*)state;
    
+#if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA))
+   speex_free_scratch(st->stack);
+#endif
+
    speex_free (st->inBuf);
    speex_free (st->excBuf);
    speex_free (st->innov);
index 93af6d4..cfa4eab 100644 (file)
@@ -227,16 +227,13 @@ void *sb_encoder_init(const SpeexMode *m)
    SBEncState *st;
    const SpeexSBMode *mode;
 
-#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
    st = (SBEncState*)speex_alloc(sizeof(SBEncState));
    if (!st)
       return NULL;
+#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
    st->stack = NULL;
 #else
-   st = (SBEncState*)speex_alloc(sizeof(SBEncState)+SB_ENC_STACK);
-   if (!st)
-      return NULL;
-   st->stack = ((char*)st) + sizeof(SBEncState);
+   st->stack = (char*)speex_alloc_scratch(SB_ENC_STACK);
 #endif
    st->mode = m;
    mode = (const SpeexSBMode*)m->mode;
@@ -337,6 +334,9 @@ void sb_encoder_destroy(void *state)
    SBEncState *st=(SBEncState*)state;
 
    speex_encoder_destroy(st->st_low);
+#if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA))
+   speex_free_scratch(st->stack);
+#endif
 
    speex_free(st);
 }
@@ -796,16 +796,13 @@ void *sb_decoder_init(const SpeexMode *m)
 {
    SBDecState *st;
    const SpeexSBMode *mode;
-#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
    st = (SBDecState*)speex_alloc(sizeof(SBDecState));
    if (!st)
       return NULL;
+#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
    st->stack = NULL;
-#else   
-   st = (SBDecState*)speex_alloc(sizeof(SBDecState)+SB_DEC_STACK);
-   if (!st)
-      return NULL;
-   st->stack = ((char*)st) + sizeof(SBDecState);
+#else
+   st->stack = (char*)speex_alloc_scratch(SB_DEC_STACK);
 #endif
    st->mode = m;
    mode=(const SpeexSBMode*)m->mode;
@@ -862,7 +859,9 @@ void sb_decoder_destroy(void *state)
    SBDecState *st;
    st = (SBDecState*)state;
    speex_decoder_destroy(st->st_low);
-
+#if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA))
+   speex_free_scratch(st->stack);
+#endif
    speex_free(state);
 }