Update for non-standard (not 8,16,32 kHz) sampling rates, changed package
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 10 Nov 2002 05:17:53 +0000 (05:17 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 10 Nov 2002 05:17:53 +0000 (05:17 +0000)
name from "Speex" to "speex" (removed capital S) and moved doc to the
devel package.

git-svn-id: http://svn.xiph.org/trunk/speex@4101 0101bb08-14d6-0310-b084-bc0e0c8e3800

Speex.spec.in
configure.in
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/sb_celp.c
libspeex/sb_celp.h
libspeex/speex.h
src/speexdec.c
src/speexenc.c

index b6404ce..f91ef24 100644 (file)
@@ -8,8 +8,8 @@ Version: %ver
 Release: %rel
 Copyright: BSD
 Group: Application/Devel
-Source: http://prdownloads.sourceforge.net/speex/%{name}-%{ver}.tar.gz
-URL: http://speex.sourceforge.net/
+Source: http://www.speex.org/download/%{name}-%{ver}.tar.gz
+URL: http://www.speex.org/
 Vendor: Speex
 Packager: Jean-Marc Valin (jean-marc.valin@hermes.usherb.ca)
 BuildRoot: /var/tmp/%{name}-build-root
@@ -57,7 +57,6 @@ make DESTDIR=$RPM_BUILD_ROOT install
 %doc COPYING AUTHORS ChangeLog NEWS README
 /usr/share/man/man1/speexenc.1*
 /usr/share/man/man1/speexdec.1*
-%doc doc/manual.pdf
 %attr(755,root,root) %{_bindir}/speex*
 %attr(755,root,root) %{_libdir}/libspeex*.so
 
@@ -66,4 +65,4 @@ make DESTDIR=$RPM_BUILD_ROOT install
 %attr(755,root,root) %{_libdir}/libspeex*.la
 %{_includedir}/speex*.h
 %{_libdir}/libspeex*.a
-
+%doc doc/manual.pdf
index 117d68f..bf11030 100644 (file)
@@ -5,7 +5,7 @@ AC_INIT(libspeex/speex.h)
 SPEEX_MAJOR_VERSION=0
 SPEEX_MINOR_VERSION=99
 SPEEX_MICRO_VERSION=0
-SPEEX_VERSION=1.0beta3-cvs
+SPEEX_VERSION=1.0beta3cvs
 SPEEX_BINARY_AGE=0
 SPEEX_INTERFACE_AGE=0
 
@@ -21,7 +21,7 @@ AC_SUBST(LT_AGE)
 
 # For automake.
 VERSION=$SPEEX_VERSION
-PACKAGE=Speex
+PACKAGE=speex
 
 AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define)
 AM_MAINTAINER_MODE
index 5c79f26..88de6fd 100644 (file)
@@ -171,6 +171,7 @@ void *nb_encoder_init(SpeexMode *m)
       st->vbr = 0;
    }
    st->complexity=2;
+   st->sampling_rate=8000;
 
    return st;
 }
@@ -783,7 +784,7 @@ void *nb_decoder_init(SpeexMode *m)
    st->pi_gain = (float*)speex_alloc(st->nbSubframes*sizeof(float));
    st->last_pitch = 40;
    st->count_lost=0;
-
+   st->sampling_rate=8000;
 
    st->user_callback.func = &speex_default_user_handler;
    st->user_callback.data = NULL;
@@ -1281,9 +1282,15 @@ void nb_encoder_ctl(void *state, int request, void *ptr)
       break;
    case SPEEX_GET_BITRATE:
       if (st->submodes[st->submodeID])
-         (*(int*)ptr) = 50*SUBMODE(bits_per_frame);
+         (*(int*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/st->frameSize;
       else
-         (*(int*)ptr) = 50*(NB_SUBMODE_BITS+1);
+         (*(int*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/st->frameSize;
+      break;
+   case SPEEX_SET_SAMPLING_RATE:
+      st->sampling_rate = (*(int*)ptr);
+      break;
+   case SPEEX_GET_SAMPLING_RATE:
+      (*(int*)ptr)=st->sampling_rate;
       break;
    case SPEEX_GET_PI_GAIN:
       {
@@ -1331,9 +1338,15 @@ void nb_decoder_ctl(void *state, int request, void *ptr)
       break;
    case SPEEX_GET_BITRATE:
       if (st->submodes[st->submodeID])
-         (*(int*)ptr) = 50*SUBMODE(bits_per_frame);
+         (*(int*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/st->frameSize;
       else
-         (*(int*)ptr) = 50*(NB_SUBMODE_BITS+1);
+         (*(int*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/st->frameSize;
+      break;
+   case SPEEX_SET_SAMPLING_RATE:
+      st->sampling_rate = (*(int*)ptr);
+      break;
+   case SPEEX_GET_SAMPLING_RATE:
+      (*(int*)ptr)=st->sampling_rate;
       break;
    case SPEEX_SET_HANDLER:
       {
index 81d8e2f..a665051 100644 (file)
@@ -102,6 +102,7 @@ typedef struct EncState {
    float    vbr_quality;    /**< Quality setting for VBR encoding */
    int    vbr_enabled;    /**< 1 for enabling VBR, 0 otherwise */
    int    complexity;     /**< Complexity setting (0-10 from least complex to most complex) */
+   int    sampling_rate;
 
    SpeexSubmode **submodes; /**< Sub-mode data */
    int    submodeID;      /**< Activated sub-mode */
@@ -120,6 +121,8 @@ typedef struct DecState {
    int    bufSize;        /**< Buffer size */
    int    min_pitch;      /**< Minimum pitch value allowed */
    int    max_pitch;      /**< Maximum pitch value allowed */
+   int    sampling_rate;
+
 
    float  gamma1;         /**< Perceptual filter: A(z/gamma1) */
    float  gamma2;         /**< Perceptual filter: A(z/gamma2) */
index a0fc830..e495fd6 100644 (file)
@@ -218,6 +218,8 @@ void *sb_encoder_init(SpeexMode *m)
    st->mem_sp2 = (float*)speex_alloc(st->lpcSize*sizeof(float));
    st->mem_sw = (float*)speex_alloc(st->lpcSize*sizeof(float));
    st->complexity=2;
+   speex_decoder_ctl(st->st_low, SPEEX_GET_SAMPLING_RATE, &st->sampling_rate);
+   st->sampling_rate*=2;
 
    return st;
 }
@@ -637,6 +639,8 @@ void *sb_decoder_init(SpeexMode *m)
    st->subframeSize = mode->subframeSize;
    st->nbSubframes = mode->frameSize/mode->subframeSize;
    st->lpcSize=8;
+   speex_decoder_ctl(st->st_low, SPEEX_GET_SAMPLING_RATE, &st->sampling_rate);
+   st->sampling_rate*=2;
 
    st->submodes=mode->submodes;
    st->submodeID=mode->defaultSubmode;
@@ -1008,9 +1012,20 @@ void sb_encoder_ctl(void *state, int request, void *ptr)
    case SPEEX_GET_BITRATE:
       speex_encoder_ctl(st->st_low, request, ptr);
       if (st->submodes[st->submodeID])
-         (*(int*)ptr) += 50*SUBMODE(bits_per_frame);
+         (*(int*)ptr) += st->sampling_rate*SUBMODE(bits_per_frame)/st->full_frame_size;
       else
-         (*(int*)ptr) += 50*(SB_SUBMODE_BITS+1);
+         (*(int*)ptr) += st->sampling_rate*(SB_SUBMODE_BITS+1)/st->full_frame_size;
+      break;
+   case SPEEX_SET_SAMPLING_RATE:
+      {
+         int tmp=(*(int*)ptr);
+         st->sampling_rate = tmp;
+         tmp>>=1;
+         speex_encoder_ctl(st->st_low, SPEEX_SET_SAMPLING_RATE, &tmp);
+      }
+      break;
+   case SPEEX_GET_SAMPLING_RATE:
+      (*(int*)ptr)=st->sampling_rate;
       break;
    case SPEEX_GET_PI_GAIN:
       {
@@ -1061,9 +1076,20 @@ void sb_decoder_ctl(void *state, int request, void *ptr)
    case SPEEX_GET_BITRATE:
       speex_decoder_ctl(st->st_low, request, ptr);
       if (st->submodes[st->submodeID])
-         (*(int*)ptr) += 50*SUBMODE(bits_per_frame);
+         (*(int*)ptr) += st->sampling_rate*SUBMODE(bits_per_frame)/st->full_frame_size;
       else
-         (*(int*)ptr) += 50*(SB_SUBMODE_BITS+1);
+         (*(int*)ptr) += st->sampling_rate*(SB_SUBMODE_BITS+1)/st->full_frame_size;
+      break;
+   case SPEEX_SET_SAMPLING_RATE:
+      {
+         int tmp=(*(int*)ptr);
+         st->sampling_rate = tmp;
+         tmp>>=1;
+         speex_decoder_ctl(st->st_low, SPEEX_SET_SAMPLING_RATE, &tmp);
+      }
+      break;
+   case SPEEX_GET_SAMPLING_RATE:
+      (*(int*)ptr)=st->sampling_rate;
       break;
    case SPEEX_SET_HANDLER:
       speex_decoder_ctl(st->st_low, SPEEX_SET_HANDLER, ptr);
index 6311570..4a81c39 100644 (file)
@@ -93,6 +93,7 @@ typedef struct SBEncState {
    SpeexSubmode **submodes;
    int    submodeID;
    int    complexity;
+   int    sampling_rate;
 
 } SBEncState;
 
@@ -107,6 +108,7 @@ typedef struct SBDecState {
    int    nbSubframes;
    int    lpcSize;
    int    first;
+   int    sampling_rate;
 
    void  *stack;
    float *x0d, *x1d;
index 9c627c8..8484aaf 100644 (file)
@@ -88,17 +88,20 @@ extern "C" {
 /** Get current complexity of the encoder (0-10) */
 #define SPEEX_GET_COMPLEXITY 17
 
-/*Would be SPEEX_SET_FRAME_SIZE, but it's (currently) invalid*/
+/** Set bit-rate used by the encoder (or lower) */
+#define SPEEX_SET_BITRATE 18
 /** Get current bit-rate used by the encoder or decoder */
 #define SPEEX_GET_BITRATE 19
 
 /**Define a handler function for in-band Speex request*/
 #define SPEEX_SET_HANDLER 20
 
-
 /**Define a handler function for in-band user-defined request*/
 #define SPEEX_SET_USER_HANDLER 22
 
+#define SPEEX_SET_SAMPLING_RATE 24
+#define SPEEX_GET_SAMPLING_RATE 25
+
 
    /* Used internally, not to be used in applications */
 #define SPEEX_GET_PI_GAIN 100
index bf2553b..c8d2877 100644 (file)
@@ -140,10 +140,13 @@ FILE *out_file_open(char *outFile, int rate, int *channels)
       }
       fout = fdopen(audio_fd, "w");
 #elif defined WIN32 || defined _WIN32
-      if (Set_WIN_Params (INVALID_FILEDESC, rate, SAMPLE_SIZE, *channels))
       {
-         fprintf (stderr, "Can't access %s\n", "WAVE OUT");
-         exit(1);
+         unsigned int speex_channels = *channels;
+         if (Set_WIN_Params (INVALID_FILEDESC, rate, SAMPLE_SIZE, speex_channels))
+         {
+            fprintf (stderr, "Can't access %s\n", "WAVE OUT");
+            exit(1);
+         }
       }
 #else
       fprintf (stderr, "No soundcard support\n");
@@ -274,6 +277,8 @@ static void *process_header(ogg_packet *op, int enh_enabled, int *frame_size, in
          *rate >>= (header->mode - forceMode);
    }
 
+   speex_decoder_ctl(st, SPEEX_SET_SAMPLING_RATE, rate);
+
    *nframes = header->frames_per_packet;
 
    if (*channels==-1)
index c21ba79..149d3d7 100644 (file)
@@ -222,7 +222,7 @@ int main(int argc, char **argv)
    /*Process command-line options*/
    while(1)
    {
-      c = getopt_long (argc, argv, "nwhvV",
+      c = getopt_long (argc, argv, "nwuhvV",
                        long_options, &option_index);
       if (c==-1)
          break;
@@ -364,21 +364,46 @@ int main(int argc, char **argv)
          exit(1);
       lsb=1; /* CHECK: exists big-endian .wav ?? */
    }
-   /*fprintf (stderr, "wave info: %d %d %d %d\n", rate, chan, fmt, size);*/
 
-   /* By default, use narrowband/8 kHz */
    if (!mode && !rate)
    {
+      /* By default, use narrowband/8 kHz */
       mode=&speex_nb_mode;
       rate=8000;
    } else if (mode && rate)
    {
-      /*FIXME: Should print some warnings if mode doesn't fit with the rate*/
+      if (rate>48000)
+      {
+         fprintf (stderr, "Bit-rate too high: %d Hz, try down-sampling\n", rate);
+         exit(1);
+      } else if (rate>25000)
+      {
+         if (mode!=&speex_uwb_mode)
+         {
+            fprintf (stderr, "WARNING: Trying to encode in %s at %d Hz. I'll do it but I suggest you try ultra-wideband instead\n", mode->modeName , rate);
+         }
+      } else if (rate>12500)
+      {
+         if (mode!=&speex_wb_mode)
+         {
+            fprintf (stderr, "WARNING: Trying to encode in %s at %d Hz. I'll do it but I suggest you try wideband instead\n", mode->modeName , rate);
+         }
+      } else if (rate>6000)
+      {
+         if (mode!=&speex_nb_mode)
+         {
+            fprintf (stderr, "WARNING: Trying to encode in %s at %d Hz. I'll do it but I suggest you try narrowband instead\n", mode->modeName , rate);
+         }
+      } else {
+         fprintf (stderr, "Bit-rate too low: %d Hz\n", rate);
+         exit(1);
+      }
    } else if (!mode)
    {
       if (rate>48000)
       {
          fprintf (stderr, "Bit-rate too high: %d Hz, try down-sampling\n", rate);
+         exit(1);
       } else if (rate>25000)
       {
          mode=&speex_uwb_mode;
@@ -390,6 +415,7 @@ int main(int argc, char **argv)
          mode=&speex_nb_mode;
       } else {
          fprintf (stderr, "Bit-rate too low: %d Hz\n", rate);
+         exit(1);
       }
    } else if (!rate)
    {
@@ -402,15 +428,20 @@ int main(int argc, char **argv)
    }
 
    if (rate!=8000 && rate!=16000 && rate!=32000)
-      fprintf (stderr, "Warning: Speex is only optimized for 8,16 and 32 kHz. It will still work at %d Hz but your mileage may vary\n", rate); 
+      fprintf (stderr, "Warning: Speex is only optimized for 8, 16 and 32 kHz. It will still work at %d Hz but your mileage may vary\n", rate); 
 
    speex_init_header(&header, rate, 1, mode);
    header.frames_per_packet=nframes;
    header.vbr=vbr_enabled;
    header.nb_channels = chan;
 
-   fprintf (stderr, "Encoding %d Hz audio using %s mode\n", 
-            header.rate, mode->modeName);
+   {
+      char *st_string="mono";
+      if (chan==2)
+         st_string="stereo";
+      fprintf (stderr, "Encoding %d Hz audio using %s mode (%s)\n", 
+               header.rate, mode->modeName, st_string);
+   }
    /*fprintf (stderr, "Encoding %d Hz audio at %d bps using %s mode\n", 
      header.rate, mode->bitrate, mode->modeName);*/
 
@@ -477,6 +508,8 @@ int main(int argc, char **argv)
 
    speex_encoder_ctl(st, SPEEX_GET_FRAME_SIZE, &frame_size);
    speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &complexity);
+   speex_encoder_ctl(st, SPEEX_SET_SAMPLING_RATE, &rate);
+
    if (vbr_enabled)
    {
       int tmp;