[speex-dev] C++ wrapper for speex
Tom Grandgent
tgrand at canvaslink.com
Tue May 25 07:44:37 PDT 2004
Ronald,
I recently wrote some wrapper classes for the Speex encoder and decoder
for use with my VoIP program. I think they're pretty high level and
easy to use. They handle all buffer allocation internally to make life
easy. Here's a simple little example that happens to use VAD:
// buf is float[] or short int[], buflen is multiple of frame size
// (there is a getFrameSize() method for both classes)
// Encode some audio
tgAudioEncoder enc(16000); // you could do 8000 instead
enc.enableVAD(1);
enc.encode(buf, buflen);
unsigned char *compressed = enc.getOutput();
int clen = enc.getOutputLen();
int speechDetected = enc.getSpeechDetected();
// Decode it
tgAudioDecoder dec(16000);
int decodedSamples = dec.decode(compressed, clen);
memcpy(buf, dec.getOutput(), decodedSamples * sizeof(short int));
Anyway, that's the basic idea. I don't think it could get much
easier. :) Now, this is only raw encoding and decoding of the audio
and doesn't have any kind of container support (like OGG), so you
can't use it with speexenc/speexdec for example. Also, there is
error checking which I have omitted from the example above.
You may use the code however you want. I only ask that you notify
me of any problems you find with it. You can download it at:
http://www.grandgent.com/tom/projects/tgAudioCodec/tgAudioCodec.zip
(This name only reflects the purpose of the classes in my project.)
Oh and by the way, should you wish to compile this, you will need
a 1.1.x version of Speex since it relies on the Speex preprocessor.
And you will also have to remove the getAGCLevel() method or
implement SPEEX_PREPROCESS_GET_AGC_GAIN, something I added to
Speex for my own use.
Good luck,
Tom
Ronald Madrid (mfcguru at yahoo.com) wrote:
>
> hi sirs,
>
> i am only recently studying speex and i'm looking for
> a C++ wrapper for speex that has higer-level
> implementations for the Encode and Decode functions,
> to sort of base my initial understaning of how the
> speex API work.
>
> i have in fact created my own, following on the
> instructions in the speex codec manual, but i havn't
> really made any positive progress. (a lot of people
> have already done it and i supposed i could do it
> also, but i'm really confused now with all my failed
> attempts.)
>
> i'm particularly interested with real-time audio and i
> have an event handler that captures audio samples like
> the ff:
>
> void CRecordSound::OnSoundData(WPARAM wParam, LPARAM
> lParam)
> {
> LPWAVEHDR lpHdr = (LPWAVEHDR) lParam;
>
> if(lpHdr)
> {
> WAVEHDR* pSpeexHdr = new WAVEHDR;
>
> BYTE * pSound = new BYTE[lpHdr->dwBufferLength];
> memcpy(pSound,lpHdr->lpData,lpHdr->dwBufferLength);
>
> pSpeexHdr->lpData = (char*)pSound;
> pSpeexHdr->dwBufferLength = lpHdr->dwBufferLength;
> pSpeexHdr->dwFlags = 0L;
> pSpeexHdr->dwLoops = 0L;
>
> m_Player->PostThreadMessage(WM_PLAYSOUND_PLAYBLOCK,
> GetCurrentThreadId(),(LPARAM) lpHdr);
> }
> }
>
> this handler would simply capture the voice data and
> immidiately play it as it is, and as far as that is
> concern, it is working.
>
> my speex case study is simple. i just want to encode
> the raw data recieved by the handler and immidiately
> decode it before posting WM_PLAYSOUND_PLAYBLOCK, and
> to supply the decoded data as appropriate.
>
> i would sincerely appreciate any offer of help,
> advices, some real source code, or whatever graces
> that would help me advance away from this ignorance.
>
> thank you to all of you and for the wonderful codec
> that is speex.
>
> ronald c. madrid
--- >8 ----
List archives: http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'speex-dev-request at xiph.org'
containing only the word 'unsubscribe' in the body. No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.
More information about the Speex-dev
mailing list