wvspeex.h

00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  *
00005  * Provides a WvEncoder abstraction for the Speex audio packet format.
00006  * suitable for encoding voice at low bitrates.
00007  *
00008  * Only monaural audio is supported for now.
00009  */
00010 #ifndef __WVSPEEX_H
00011 #define __WVSPEEX_H
00012 
00013 #include "wvaudioencoder.h"
00014 
00015 struct SpeexMode;
00016 struct SpeexBits;
00017 
00018 namespace WvSpeex
00019 {
00021     static const int DEFAULT_COMPLEXITY = -1;
00022     
00028     enum CodecMode
00029     {
00030         DEFAULT_MODE = -1,      
00031         NARROWBAND_MODE = 0,    
00032         WIDEBAND_MODE = 1,      
00033         ULTRAWIDEBAND_MODE = 2  
00034     };
00035 
00043     class BitrateSpec
00044     {
00045     public:
00046         // TODO: check whether VBR_BITRATE is a valid mode
00047         enum Mode { VBR_QUALITY, CBR_QUALITY, CBR_BITRATE };
00048         Mode mode;
00049         float quality_index;
00050         int nominal_bitrate;
00051         
00052     protected:
00053         BitrateSpec(Mode mode) : mode(mode) { }
00054 
00055     public:
00056         // allow creation of uninitialized objects for later assignment
00057         BitrateSpec() { }
00058     };
00059     
00064     class VBRQuality : public BitrateSpec
00065     {
00066     public:
00071         VBRQuality(float quality) : BitrateSpec(VBR_QUALITY)
00072         {
00073             quality_index = quality;
00074         }
00075     };
00076     
00084     class CBRBitrate : public BitrateSpec
00085     {
00086     public:
00091         CBRBitrate(int nominal) : BitrateSpec(CBR_BITRATE)
00092         {
00093             nominal_bitrate = nominal;
00094         }
00095     };
00096     
00101     class CBRQuality : public BitrateSpec
00102     {
00103     public:
00108         CBRQuality(float quality) : BitrateSpec(CBR_QUALITY)
00109         {
00110             quality_index = quality;
00111         }
00112     };
00113 }; // namespace
00114 
00115 
00116 
00147 class WvSpeexEncoder : public WvAudioEncoder
00148 {
00149     void *spxstate;
00150     SpeexBits *spxbits;
00151     SpeexMode *spxmode;
00152     unsigned int _channels;
00153     size_t _samplesperframe;
00154     
00155 public:
00156 
00173     WvSpeexEncoder(const WvSpeex::BitrateSpec &bitratespec,
00174         int samplingrate, unsigned int channels = 1,
00175         WvSpeex::CodecMode mode = WvSpeex::DEFAULT_MODE,
00176         int complexity = WvSpeex::DEFAULT_COMPLEXITY);
00177         
00178     virtual ~WvSpeexEncoder();
00179     
00184     int samplingrate() const;
00185     
00190     virtual unsigned int channels() const
00191         { return _channels; }
00192 
00197     virtual size_t samplesperframe() const
00198         { return _samplesperframe; }
00199 
00204     WvSpeex::CodecMode mode() const;
00205 
00210     bool vbr() const;
00211 
00216     int nominalbitrate() const;
00217 
00218 protected:
00219     virtual bool _typedencode(IBuffer &inbuf, OBuffer &outbuf,
00220         bool flush);
00221     virtual bool _typedfinish(OBuffer &outbuf);
00222 
00223 private:
00224     bool flushspxbits(OBuffer &outbuf);
00225 };
00226 
00227 
00228 
00260 class WvSpeexDecoder : public WvAudioDecoder
00261 {
00262     int _samplingrate;
00263     unsigned int _channels;
00264     
00265     void *spxstate;
00266     SpeexBits *spxbits;
00267     SpeexMode *spxmode;
00268     size_t _samplesperframe;
00269 
00270 public:
00285     WvSpeexDecoder(int samplingrate, unsigned int channels = 1,
00286         WvSpeex::CodecMode mode = WvSpeex::DEFAULT_MODE);
00287 
00288     virtual ~WvSpeexDecoder();
00289     
00296     virtual bool missing(OBuffer &outbuf);
00297 
00302     virtual unsigned int channels() const
00303         { return _channels; }
00304 
00309     int samplingrate() const
00310         { return _samplingrate; }
00311 
00316     virtual size_t samplesperframe() const
00317         { return _samplesperframe; }
00318 
00323     WvSpeex::CodecMode mode() const;
00324     
00329     bool postfilter() const;
00330 
00335     void setpostfilter(bool enable);
00336 
00337 protected:
00338     virtual bool _typedencode(IBuffer &inbuf, OBuffer &outbuf,
00339         bool flush);
00340     virtual bool _typedfinish(OBuffer &outbuf);
00341 };
00342 
00343 #endif // __WVSPEEX_H

Generated on Fri Oct 5 18:20:28 2007 for WvStreams by  doxygen 1.5.3