diff options
| author | 2008-04-03 23:29:02 +0000 | |
|---|---|---|
| committer | 2008-04-03 23:29:02 +0000 | |
| commit | 529524db3f530e4edaf741a40a91d1a5787027ac (patch) | |
| tree | 681d9b67ad62dea930a09e46aefa7e6a0cd418fd /src/modules/dcc/gsmcodec.cpp | |
| parent | get rid of $KVI_INSTALL_PREFIX and $KVI_VERSION_BRANCH ; more cmake fixes for... (diff) | |
| download | KVIrc-529524db3f530e4edaf741a40a91d1a5787027ac.tar.gz KVIrc-529524db3f530e4edaf741a40a91d1a5787027ac.tar.bz2 KVIrc-529524db3f530e4edaf741a40a91d1a5787027ac.zip | |
added a skel for windows on Tom's patch
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@1386 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules/dcc/gsmcodec.cpp')
| -rw-r--r-- | src/modules/dcc/gsmcodec.cpp | 221 |
1 files changed, 109 insertions, 112 deletions
diff --git a/src/modules/dcc/gsmcodec.cpp b/src/modules/dcc/gsmcodec.cpp index 85f274abf..345fed909 100644 --- a/src/modules/dcc/gsmcodec.cpp +++ b/src/modules/dcc/gsmcodec.cpp @@ -25,125 +25,122 @@ #include "gsmcodec.h" #ifdef COMPILE_USE_GSM - -#include <dlfcn.h> - -#define GSM_PACKED_FRAME_SIZE_IN_BYTES 33 -#define GSM_UNPACKED_FRAME_SIZE_IN_BYTES 320 -#define GSM_UNPACKED_FRAME_SIZE_IN_SHORTS 160 - -void * (*gsm_session_create)() = 0; -void (*gsm_session_destroy)(void *) = 0; -void (*gsm_session_encode)(void *,short *,unsigned char *) = 0; -int (*gsm_session_decode)(void *,unsigned char *,short *) = 0; - - -void * g_pGSMCodecLibraryHandle = 0; - -bool kvi_gsm_codec_init() -{ - if(g_pGSMCodecLibraryHandle)return true; // Already initialized - - g_pGSMCodecLibraryHandle = dlopen("libgsm.so",RTLD_NOW | RTLD_GLOBAL); - if(!g_pGSMCodecLibraryHandle)return false; // no way to open it - - gsm_session_create = (void * (*)()) dlsym(g_pGSMCodecLibraryHandle,"gsm_create"); - gsm_session_destroy = (void (*)(void *)) dlsym(g_pGSMCodecLibraryHandle,"gsm_destroy"); - gsm_session_encode = (void (*)(void *,short *,unsigned char *)) dlsym(g_pGSMCodecLibraryHandle,"gsm_encode"); - gsm_session_decode = (int (*)(void *,unsigned char *,short *)) dlsym(g_pGSMCodecLibraryHandle,"gsm_decode"); - - if(! (gsm_session_create && gsm_session_destroy && gsm_session_encode && gsm_session_decode)) + #include <dlfcn.h> + + #define GSM_PACKED_FRAME_SIZE_IN_BYTES 33 + #define GSM_UNPACKED_FRAME_SIZE_IN_BYTES 320 + #define GSM_UNPACKED_FRAME_SIZE_IN_SHORTS 160 + + void * (*gsm_session_create)() = 0; + void (*gsm_session_destroy)(void *) = 0; + void (*gsm_session_encode)(void *,short *,unsigned char *) = 0; + int (*gsm_session_decode)(void *,unsigned char *,short *) = 0; + + void * g_pGSMCodecLibraryHandle = 0; + + bool kvi_gsm_codec_init() { - dlclose(g_pGSMCodecLibraryHandle); - g_pGSMCodecLibraryHandle = 0; - return false; + if(g_pGSMCodecLibraryHandle)return true; // Already initialized + + g_pGSMCodecLibraryHandle = dlopen("libgsm.so",RTLD_NOW | RTLD_GLOBAL); + if(!g_pGSMCodecLibraryHandle)return false; // no way to open it + + gsm_session_create = (void * (*)()) dlsym(g_pGSMCodecLibraryHandle,"gsm_create"); + gsm_session_destroy = (void (*)(void *)) dlsym(g_pGSMCodecLibraryHandle,"gsm_destroy"); + gsm_session_encode = (void (*)(void *,short *,unsigned char *)) dlsym(g_pGSMCodecLibraryHandle,"gsm_encode"); + gsm_session_decode = (int (*)(void *,unsigned char *,short *)) dlsym(g_pGSMCodecLibraryHandle,"gsm_decode"); + + if(! (gsm_session_create && gsm_session_destroy && gsm_session_encode && gsm_session_decode)) + { + dlclose(g_pGSMCodecLibraryHandle); + g_pGSMCodecLibraryHandle = 0; + return false; + } + return true; } - return true; -} - -void kvi_gsm_codec_done() -{ - if(g_pGSMCodecLibraryHandle) + + void kvi_gsm_codec_done() { - dlclose(g_pGSMCodecLibraryHandle); - g_pGSMCodecLibraryHandle = 0; + if(g_pGSMCodecLibraryHandle) + { + dlclose(g_pGSMCodecLibraryHandle); + g_pGSMCodecLibraryHandle = 0; + } } -} - - - -KviDccVoiceGsmCodec::KviDccVoiceGsmCodec() -: KviDccVoiceCodec() -{ - m_pEncodeState = gsm_session_create(); - m_pDecodeState = gsm_session_create(); - m_szName = "gsm (compression 33:320)"; -} - -KviDccVoiceGsmCodec::~KviDccVoiceGsmCodec() -{ - gsm_session_destroy(m_pEncodeState); - gsm_session_destroy(m_pDecodeState); -} - -void KviDccVoiceGsmCodec::encode(KviDataBuffer * signal,KviDataBuffer * stream) -{ - if(signal->size() < GSM_UNPACKED_FRAME_SIZE_IN_BYTES)return; // nothing to encode - - unsigned char * ptr = signal->data(); - - int uFrames = signal->size() / GSM_UNPACKED_FRAME_SIZE_IN_BYTES; - int uTotalDataCompressed = uFrames * GSM_UNPACKED_FRAME_SIZE_IN_BYTES; - int uFrameOffset = stream->size(); - unsigned char * endPtr = ptr + uTotalDataCompressed; - - stream->addSize(GSM_PACKED_FRAME_SIZE_IN_BYTES * uFrames); - - while(ptr != endPtr) + + + KviDccVoiceGsmCodec::KviDccVoiceGsmCodec() + : KviDccVoiceCodec() { - gsm_session_encode(m_pEncodeState,(short *)ptr,stream->data() + uFrameOffset); - ptr += GSM_UNPACKED_FRAME_SIZE_IN_BYTES; - uFrameOffset += GSM_PACKED_FRAME_SIZE_IN_BYTES; + m_pEncodeState = gsm_session_create(); + m_pDecodeState = gsm_session_create(); + m_szName = "gsm (compression 33:320)"; } - signal->remove(uTotalDataCompressed); -} - -void KviDccVoiceGsmCodec::decode(KviDataBuffer * stream,KviDataBuffer * signal) -{ - if(stream->size() < GSM_PACKED_FRAME_SIZE_IN_BYTES)return; // nothing to decode - - unsigned char * ptr = stream->data(); - - // Gsm codec - int uFrames = stream->size() / GSM_PACKED_FRAME_SIZE_IN_BYTES; - int uTotalDataDecompressed = uFrames * GSM_PACKED_FRAME_SIZE_IN_BYTES; - int uSignalOffset = signal->size(); - unsigned char * endPtr = ptr + (uTotalDataDecompressed); - - signal->addSize(GSM_UNPACKED_FRAME_SIZE_IN_BYTES * uFrames); - - while(ptr != endPtr) + + KviDccVoiceGsmCodec::~KviDccVoiceGsmCodec() { - // We don't check the return value here - // Well..it is either an unrecoverable internal error - // or a broken frame... - // but if we receive broken frames over DCC...well....better - // check the hardware...or the remote codec as well... - gsm_session_decode(m_pDecodeState,ptr,(short *)(signal->data() + uSignalOffset)); - ptr += GSM_PACKED_FRAME_SIZE_IN_BYTES; - uSignalOffset += GSM_UNPACKED_FRAME_SIZE_IN_BYTES; + gsm_session_destroy(m_pEncodeState); + gsm_session_destroy(m_pDecodeState); + } + + void KviDccVoiceGsmCodec::encode(KviDataBuffer * signal,KviDataBuffer * stream) + { + if(signal->size() < GSM_UNPACKED_FRAME_SIZE_IN_BYTES)return; // nothing to encode + + unsigned char * ptr = signal->data(); + + int uFrames = signal->size() / GSM_UNPACKED_FRAME_SIZE_IN_BYTES; + int uTotalDataCompressed = uFrames * GSM_UNPACKED_FRAME_SIZE_IN_BYTES; + int uFrameOffset = stream->size(); + unsigned char * endPtr = ptr + uTotalDataCompressed; + + stream->addSize(GSM_PACKED_FRAME_SIZE_IN_BYTES * uFrames); + + while(ptr != endPtr) + { + gsm_session_encode(m_pEncodeState,(short *)ptr,stream->data() + uFrameOffset); + ptr += GSM_UNPACKED_FRAME_SIZE_IN_BYTES; + uFrameOffset += GSM_PACKED_FRAME_SIZE_IN_BYTES; + } + signal->remove(uTotalDataCompressed); + } + + void KviDccVoiceGsmCodec::decode(KviDataBuffer * stream,KviDataBuffer * signal) + { + if(stream->size() < GSM_PACKED_FRAME_SIZE_IN_BYTES)return; // nothing to decode + + unsigned char * ptr = stream->data(); + + // Gsm codec + int uFrames = stream->size() / GSM_PACKED_FRAME_SIZE_IN_BYTES; + int uTotalDataDecompressed = uFrames * GSM_PACKED_FRAME_SIZE_IN_BYTES; + int uSignalOffset = signal->size(); + unsigned char * endPtr = ptr + (uTotalDataDecompressed); + + signal->addSize(GSM_UNPACKED_FRAME_SIZE_IN_BYTES * uFrames); + + while(ptr != endPtr) + { + // We don't check the return value here + // Well..it is either an unrecoverable internal error + // or a broken frame... + // but if we receive broken frames over DCC...well....better + // check the hardware...or the remote codec as well... + gsm_session_decode(m_pDecodeState,ptr,(short *)(signal->data() + uSignalOffset)); + ptr += GSM_PACKED_FRAME_SIZE_IN_BYTES; + uSignalOffset += GSM_UNPACKED_FRAME_SIZE_IN_BYTES; + } + stream->remove(uTotalDataDecompressed); + } + + int KviDccVoiceGsmCodec::encodedFrameSize() + { + return GSM_PACKED_FRAME_SIZE_IN_BYTES; + } + + int KviDccVoiceGsmCodec::decodedFrameSize() + { + return GSM_UNPACKED_FRAME_SIZE_IN_BYTES; } - stream->remove(uTotalDataDecompressed); -} - -int KviDccVoiceGsmCodec::encodedFrameSize() -{ - return GSM_PACKED_FRAME_SIZE_IN_BYTES; -} - -int KviDccVoiceGsmCodec::decodedFrameSize() -{ - return GSM_UNPACKED_FRAME_SIZE_IN_BYTES; -} #endif // COMPILE_USE_GSM |
