00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "wvaudioencoder.h"
00012 #include "wvpcmutils.h"
00013
00014
00015
00016
00017
00018 WvSimpleAudioEncoder::WvSimpleAudioEncoder(unsigned int channels,
00019 unsigned int samplerate) :
00020 _channels(channels), _samplesperframe(samplerate / 1000 * 20)
00021 {
00022 }
00023
00024
00025 bool WvSimpleAudioEncoder::_typedencode(IBuffer &inbuf, OBuffer &outbuf,
00026 bool flush)
00027 {
00028 static WvPCMUnnormFloatToSigned16Functor f;
00029
00030 for (;;)
00031 {
00032
00033 size_t count = inbuf.used();
00034 if (count == 0) return true;
00035 if (count < _samplesperframe)
00036 return ! flush;
00037
00038
00039 while (count > 0)
00040 {
00041 size_t avail = outbuf.optallocable();
00042 if (avail == 0) return false;
00043 if (avail > count) avail = count;
00044 count -= avail;
00045
00046 const IType *indata = inbuf.get(avail);
00047 OType *outdata = outbuf.alloc(avail);
00048 while (avail-- > 0)
00049 *(outdata++) = f(*(indata++));
00050 }
00051
00052
00053 if (! flush)
00054 return true;
00055 }
00056 }
00057
00058
00059 bool WvSimpleAudioEncoder::_typedfinish(OBuffer &outbuf)
00060 {
00061 return true;
00062 }
00063
00064
00065
00066
00067
00068 WvSimpleAudioDecoder::WvSimpleAudioDecoder(unsigned int channels,
00069 unsigned int samplerate) :
00070 _channels(channels), _samplesperframe(samplerate / 1000 * 20)
00071 {
00072 }
00073
00074
00075 bool WvSimpleAudioDecoder::_typedencode(IBuffer &inbuf, OBuffer &outbuf,
00076 bool flush)
00077 {
00078 static WvPCMSigned16ToUnnormFloatFunctor f;
00079
00080 for (;;)
00081 {
00082 size_t avail = inbuf.used();
00083 if (avail == 0) return true;
00084 if (outbuf.free() < _samplesperframe)
00085 return false;
00086
00087 size_t skip = 0;
00088 if (avail > _samplesperframe)
00089 {
00090
00091 skip = avail - _samplesperframe;
00092 avail -= skip;
00093 }
00094
00095 const IType *indata = inbuf.get(avail);
00096 inbuf.skip(skip);
00097 OType *outdata = outbuf.alloc(_samplesperframe);
00098 while (avail-- > 0)
00099 *(outdata++) = f(*(indata++));
00100
00101 if (! flush)
00102 return true;
00103 }
00104 }
00105
00106
00107 bool WvSimpleAudioDecoder::_typedfinish(OBuffer &outbuf)
00108 {
00109 return true;
00110 }