Use direct dependency on libgsm instead of loading it at runtime if available

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
feat/cmake-conversion
Michele Calgaro 6 days ago
parent eba1651fe3
commit e8b4f8d8a3
Signed by: MicheleC
GPG Key ID: 2A75B7CA8ADED5CF

@ -590,12 +590,15 @@ AC_DEFUN([AC_SS_MISC_OPTIONS],
if test "$SS_NO_GSM" = "true"; then
AC_MSG_RESULT(yes)
else
AC_DEFINE([COMPILE_USE_GSM], 1, [define if you have libgsm and want the GSM code to be compiled])
SS_BUILD_FLAGS="G$SS_BUILD_FLAGS"
AC_MSG_RESULT(no)
AC_CHECK_HEADER(gsm/gsm.h,HAVE_GSM_H="yes",HAVE_GSM_H="no")
AC_CHECK_LIB(gsm, gsm_create, HAVE_GSM_LIB="yes", HAVE_GSM_LIB="no")
if test "x$HAVE_GSM_H" = "xyes" && test "x$HAVE_GSM_LIB" = "xyes"; then
AC_DEFINE([COMPILE_USE_GSM], 1, [define if you have libgsm and want the GSM code to be compiled])
SS_BUILD_FLAGS="G$SS_BUILD_FLAGS"
fi
fi
AC_MSG_CHECKING([if you want to ignore SIGALARM])
AC_ARG_WITH(ignore-sigalarm, [ --with-ignore-sigalarm Ignore SIGALARM in all threads],SS_IGNORE_SIGALARM="true")
if test "$SS_IGNORE_SIGALARM" = "true"; then

@ -23,67 +23,26 @@
#define _GSMCODEC_CPP_
#include "gsmcodec.h"
#include <gsm/gsm.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))
{
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 +60,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 +88,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;
}

@ -27,12 +27,9 @@
#ifdef COMPILE_USE_GSM
#include "codec.h"
class gsm_state;
#ifndef _GSMCODEC_CPP_
extern bool kvi_gsm_codec_init();
extern void kvi_gsm_codec_done();
#endif //_GSMCODEC_CPP_
#include "codec.h"
class KviDccVoiceGsmCodec : public KviDccVoiceCodec
{
@ -40,8 +37,8 @@
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);

@ -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;
}

@ -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();

Loading…
Cancel
Save