From 6455951d955dc73c7e8f9fddea35a890b6bed4cf Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Fri, 27 Feb 2026 11:19:29 +0900 Subject: Use direct dependency on libgsm instead of loading it at runtime if available Signed-off-by: Michele Calgaro --- src/modules/dcc/gsmcodec.cpp | 54 +++++-------------------------------------- src/modules/dcc/gsmcodec.h | 10 +++----- src/modules/dcc/libkvidcc.cpp | 4 ---- src/modules/dcc/voice.cpp | 10 ++------ 4 files changed, 11 insertions(+), 67 deletions(-) (limited to 'src/modules') diff --git a/src/modules/dcc/gsmcodec.cpp b/src/modules/dcc/gsmcodec.cpp index 58af1473..22320eb4 100644 --- a/src/modules/dcc/gsmcodec.cpp +++ b/src/modules/dcc/gsmcodec.cpp @@ -26,64 +26,22 @@ #ifdef COMPILE_USE_GSM -#include - #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)) - { - dlclose(g_pGSMCodecLibraryHandle); - g_pGSMCodecLibraryHandle = 0; - return false; - } - return true; -} - -void kvi_gsm_codec_done() -{ - if(g_pGSMCodecLibraryHandle) - { - dlclose(g_pGSMCodecLibraryHandle); - g_pGSMCodecLibraryHandle = 0; - } -} - - - KviDccVoiceGsmCodec::KviDccVoiceGsmCodec() : KviDccVoiceCodec() { - m_pEncodeState = gsm_session_create(); - m_pDecodeState = gsm_session_create(); + m_pEncodeState = gsm_create(); + m_pDecodeState = gsm_create(); m_szName = "gsm (compression 33:320)"; } KviDccVoiceGsmCodec::~KviDccVoiceGsmCodec() { - gsm_session_destroy(m_pEncodeState); - gsm_session_destroy(m_pDecodeState); + gsm_destroy(m_pEncodeState); + gsm_destroy(m_pDecodeState); } void KviDccVoiceGsmCodec::encode(KviDataBuffer * signal,KviDataBuffer * stream) @@ -101,7 +59,7 @@ void KviDccVoiceGsmCodec::encode(KviDataBuffer * signal,KviDataBuffer * stream) while(ptr != endPtr) { - gsm_session_encode(m_pEncodeState,(short *)ptr,stream->data() + uFrameOffset); + gsm_encode(m_pEncodeState,(short *)ptr,stream->data() + uFrameOffset); ptr += GSM_UNPACKED_FRAME_SIZE_IN_BYTES; uFrameOffset += GSM_PACKED_FRAME_SIZE_IN_BYTES; } @@ -129,7 +87,7 @@ void KviDccVoiceGsmCodec::decode(KviDataBuffer * stream,KviDataBuffer * signal) // 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)); + gsm_decode(m_pDecodeState,ptr,(short *)(signal->data() + uSignalOffset)); ptr += GSM_PACKED_FRAME_SIZE_IN_BYTES; uSignalOffset += GSM_UNPACKED_FRAME_SIZE_IN_BYTES; } diff --git a/src/modules/dcc/gsmcodec.h b/src/modules/dcc/gsmcodec.h index a1de407b..0ec7155a 100644 --- a/src/modules/dcc/gsmcodec.h +++ b/src/modules/dcc/gsmcodec.h @@ -27,21 +27,17 @@ #ifdef COMPILE_USE_GSM + #include "gsm.h" #include "codec.h" - #ifndef _GSMCODEC_CPP_ - extern bool kvi_gsm_codec_init(); - extern void kvi_gsm_codec_done(); - #endif //_GSMCODEC_CPP_ - class KviDccVoiceGsmCodec : public KviDccVoiceCodec { public: KviDccVoiceGsmCodec(); virtual ~KviDccVoiceGsmCodec(); private: - void * m_pEncodeState; - void * m_pDecodeState; + gsm_state * m_pEncodeState; + gsm_state * m_pDecodeState; public: virtual void encode(KviDataBuffer * signal,KviDataBuffer * stream); virtual void decode(KviDataBuffer * stream,KviDataBuffer * signal); diff --git a/src/modules/dcc/libkvidcc.cpp b/src/modules/dcc/libkvidcc.cpp index d9ae6567..a5045276 100644 --- a/src/modules/dcc/libkvidcc.cpp +++ b/src/modules/dcc/libkvidcc.cpp @@ -2741,10 +2741,6 @@ static bool dcc_module_cleanup(KviModule *m) { delete g_pDccBroker; g_pDccBroker = 0; -#ifdef COMPILE_USE_GSM - kvi_gsm_codec_done(); -#endif - return true; } diff --git a/src/modules/dcc/voice.cpp b/src/modules/dcc/voice.cpp index 6a98313f..3c3c2014 100644 --- a/src/modules/dcc/voice.cpp +++ b/src/modules/dcc/voice.cpp @@ -94,10 +94,7 @@ extern KviDccBroker * g_pDccBroker; bool kvi_dcc_voice_is_valid_codec(const char * codecName) { #ifdef COMPILE_USE_GSM - if(kvi_strEqualCI("gsm",codecName)) - { - return kvi_gsm_codec_init(); - } + if(kvi_strEqualCI("gsm",codecName))return true; #endif if(kvi_strEqualCI("adpcm",codecName))return true; if(kvi_strEqualCI("null",codecName))return true; @@ -107,10 +104,7 @@ bool kvi_dcc_voice_is_valid_codec(const char * codecName) static KviDccVoiceCodec * kvi_dcc_voice_get_codec(const char * codecName) { #ifdef COMPILE_USE_GSM - if(kvi_strEqualCI("gsm",codecName)) - { - if(kvi_gsm_codec_init())return new KviDccVoiceGsmCodec(); - } + if(kvi_strEqualCI("gsm",codecName))return new KviDccVoiceGsmCodec(); #endif if(kvi_strEqualCI("adpcm",codecName))return new KviDccVoiceAdpcmCodec(); if(kvi_strEqualCI("null",codecName))return new KviDccVoiceNullCodec(); -- cgit v1.2.3