summaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2026-02-27 11:19:29 +0900
committerMichele Calgaro <michele.calgaro@yahoo.it>2026-02-27 11:19:29 +0900
commit6455951d955dc73c7e8f9fddea35a890b6bed4cf (patch)
tree43fd089d0bae124ae52d891ce191f7fbae40c482 /src/modules
parenteba1651fe3e71f0c650a2159446b0817f1e04593 (diff)
downloadkvirc-feat/use-libgsm-dev.tar.gz
kvirc-feat/use-libgsm-dev.zip
Use direct dependency on libgsm instead of loading it at runtime if availablefeat/use-libgsm-dev
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/dcc/gsmcodec.cpp54
-rw-r--r--src/modules/dcc/gsmcodec.h10
-rw-r--r--src/modules/dcc/libkvidcc.cpp4
-rw-r--r--src/modules/dcc/voice.cpp10
4 files changed, 11 insertions, 67 deletions
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 <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))
- {
- 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();