00001
00002
00003
00004
00005
00006
00007
00008
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
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
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 };
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