From e103d846de58883315a623e94f12831dba7394c3 Mon Sep 17 00:00:00 2001
From: Emmanuel Milou
 <emmanuel.milou@savoirfairelinux.comemmanuel.milou@savoirfairelinux.com>
Date: Fri, 25 Jan 2008 15:02:34 -0500
Subject: [PATCH] [Dynamic codecs]Close and destroy the pointers functions.

---
 src/audio/audiortp.cpp | 69 ++++++++++++++----------------------------
 src/audio/audiortp.h   | 15 ++++++++-
 src/iaxvoiplink.cpp    | 23 ++++++++------
 src/iaxvoiplink.h      |  9 ++++++
 src/sipcall.cpp        |  1 -
 5 files changed, 59 insertions(+), 58 deletions(-)

diff --git a/src/audio/audiortp.cpp b/src/audio/audiortp.cpp
index e4b16cbdfa..ba6ffb880e 100644
--- a/src/audio/audiortp.cpp
+++ b/src/audio/audiortp.cpp
@@ -258,45 +258,49 @@ AudioRtpRTX::initAudioRtpSession (void)
 AudioCodec*
 AudioRtpRTX::loadCodec(int payload)
 {
-	using std::cout;
         using std::cerr;
-    	void* codec;	
 
 	switch(payload){
 	  case 0:
-            codec = dlopen("codec_ulaw.so", RTLD_LAZY);
+            handle_codec = dlopen("codec_ulaw.so", RTLD_LAZY);
 	    break;
 	  case 3:
-	    codec = dlopen("codec_gsm.so", RTLD_LAZY);
+	    handle_codec = dlopen("codec_gsm.so", RTLD_LAZY);
 	    break;
 	  case 8:
-	    codec = dlopen("codec_alaw.so", RTLD_LAZY);
+	    handle_codec = dlopen("codec_alaw.so", RTLD_LAZY);
 	    break;
 	}
 
-        if(!codec){
+        if(!handle_codec){
                 cerr<<"cannot load library: "<< dlerror() <<'\n';
         }
         dlerror();
-        create_t* create_codec = (create_t*)dlsym(codec, "create");
+        create_t* create_codec = (create_t*)dlsym(handle_codec, "create");
         const char* dlsym_error = dlerror();
         if(dlsym_error){
                 cerr << "Cannot load symbol create: " << dlsym_error << '\n';
         }
-        destroy_t* destroy_codec = (destroy_t*) dlsym(codec, "destroy");
-        dlsym_error = dlerror();
-        if(dlsym_error){
-                cerr << "Cannot load symbol destroy" << dlsym_error << '\n';
-        }
         return create_codec();
+}
 
+void
+AudioRtpRTX::unloadCodec(AudioCodec* audiocodec)
+{
+	using std::cerr;
+        destroy_t* destroy_codec = (destroy_t*)dlsym(handle_codec, "destroy");
+	const char* dlsym_error = dlerror();
+	if(dlsym_error){
+                cerr << "Cannot load symbol destroy" << dlsym_error << '\n';
+        }
+	destroy_codec(audiocodec);
+	dlclose(handle_codec);
 }
 
 	
 void
 AudioRtpRTX::sendSessionFromMic(int timestamp)
 {
-
 	AudioCodec* audiocodec = loadCodec(_ca->getAudioCodec());
 
 // STEP:
@@ -358,10 +362,7 @@ try {
 	_debugException("! ARTP: sending failed");
 	throw;
 }
-
-
-//destroy_codec(audiocodec);
-//dlclose(codec);
+	unloadCodec(audiocodec);
 }
 
 
@@ -369,6 +370,9 @@ try {
 void
 AudioRtpRTX::receiveSessionForSpkr (int& countTime)
 {
+
+AudioCodec* audiocodec;
+
 if (_ca == 0) { return; }
 try {
 	AudioLayer* audiolayer = Manager::instance().getAudioDriver();
@@ -391,33 +395,8 @@ try {
 	unsigned char* data  = (unsigned char*)adu->getData(); // data in char
 	unsigned int size    = adu->getSize(); // size in char
 	
-/*using std::cout;
-using std::cerr;
-void* codec = dlopen("codec_alaw.so", RTLD_LAZY);
-if(!codec){
-	cerr<<"cannot load library: "<< dlerror() <<'\n';
-}
-
-//reset errors
-dlerror();
-
-//load the symbols
-create_t* create_codec = (create_t*)dlsym(codec, "create");
-const char* dlsym_error = dlerror();
-if(dlsym_error){
-	cerr << "Cannot load symbol create: " << dlsym_error << '\n';
-}
-destroy_t* destroy_codec = (destroy_t*) dlsym(codec, "destroy");
-dlsym_error = dlerror();
-if(dlsym_error){
-	cerr << "Cannot load symbol destroy" << dlsym_error << '\n';
-}
-
-AudioCodec* audiocodec = create_codec();        
-*/
-AudioCodec* audiocodec = loadCodec(payload);
+	audiocodec = loadCodec(payload);
 	// Decode data with relevant codec
-	//AudioCodec* audiocodec = _ca->getCodecMap().getCodec((CodecType)payload);
 	_codecSampleRate = audiocodec->getClockRate();
 	int max = (int)(_codecSampleRate * _layerFrameSize);
 
@@ -467,14 +446,12 @@ AudioCodec* audiocodec = loadCodec(payload);
 	}
 
 	delete adu; adu = NULL;
-//destroy_codec(audiocodec);
-//dlclose(codec);
 } catch(...) {
 	_debugException("! ARTP: receiving failed");
 	throw;
 }
 
-
+  unloadCodec(audiocodec);
 
 }
 
diff --git a/src/audio/audiortp.h b/src/audio/audiortp.h
index 09dda4c205..c37174826e 100644
--- a/src/audio/audiortp.h
+++ b/src/audio/audiortp.h
@@ -120,8 +120,21 @@ class AudioRtpRTX : public ost::Thread, public ost::TimerPort {
  		 */
 		int downSampleData(int, int);
 
-
+		/** Pointer on function to handle codecs **/
+		void* handle_codec;
+		
+		/**
+ 		 * Load dynamically a codec (.so library) 
+ 		 * @param payload The payload of the codec you want to load
+ 		 * @return AudioCodec* A pointer on a audio codec object
+ 		 */
 		AudioCodec* loadCodec(int payload);
+		
+		/**
+ 		 * Destroy and close dynamically a codec (.so library) 
+ 		 * @param audiocodec The audio codec you want to unload
+ 		 */
+		void unloadCodec(AudioCodec* audiocodec);
 };
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/iaxvoiplink.cpp b/src/iaxvoiplink.cpp
index de824d06d9..90054839a6 100644
--- a/src/iaxvoiplink.cpp
+++ b/src/iaxvoiplink.cpp
@@ -231,9 +231,7 @@ IAXVoIPLink::getEvent()
 AudioCodec* 
 IAXVoIPLink::loadCodec(int payload)
 {
-   using std::cout;
    using std::cerr;
-   void* handle_codec;
 
    switch(payload)
    {
@@ -259,12 +257,21 @@ IAXVoIPLink::loadCodec(int payload)
   if(dlsym_error){
         cerr << "Cannot load symbol create: " << dlsym_error << '\n';
   }
+  return create_codec();
+}
+
+void
+IAXVoIPLink::unloadCodec(AudioCodec* audiocodec)
+{
+  using std::cerr;
+
   destroy_t* destroy_codec = (destroy_t*) dlsym(handle_codec, "destroy");
-  dlsym_error = dlerror();
+  const char* dlsym_error = dlerror();
   if(dlsym_error){
        cerr << "Cannot load symbol destroy" << dlsym_error << '\n';
   }
-  return create_codec();
+  destroy_codec(audiocodec);
+  dlclose(handle_codec);
 }
 
 void
@@ -404,9 +411,7 @@ IAXVoIPLink::sendAudioFromMic(void)
     }
     _mutexIAX.leaveMutex();
   }
-
-  //destroy_codec(audiocodec);
-  //dlclose(codec);
+  unloadCodec(audiocodec);
 }
 
 
@@ -867,9 +872,7 @@ AudioCodec* audiocodec;
     } else {
       _debug("IAX: incoming audio, but no sound card open");
     }
-//destroy_codec(audiocodec);
-//dlclose(codec);
-
+  unloadCodec(audiocodec);
 
 }
 
diff --git a/src/iaxvoiplink.h b/src/iaxvoiplink.h
index 02e910c342..c0fe8c30a8 100644
--- a/src/iaxvoiplink.h
+++ b/src/iaxvoiplink.h
@@ -158,6 +158,15 @@ private:
   */ 
   AudioCodec* loadCodec(int payload);
 
+ /**
+  * Destroy and close the pointer on the codec
+  * @param audiocodec the codec you want to unload
+  */  
+  void unloadCodec(AudioCodec* audiocodec);
+
+  /** pointer on function **/
+  void* handle_codec;
+
   /** Threading object */
   EventThread* _evThread;
 
diff --git a/src/sipcall.cpp b/src/sipcall.cpp
index 0b01f94626..b81b0773b9 100644
--- a/src/sipcall.cpp
+++ b/src/sipcall.cpp
@@ -599,7 +599,6 @@ SIPCall::setAudioCodecFromSDP(sdp_media_t* remote_med, int tid)
     int payload = atoi (tmp);
     _debug("            Payload: %d\n", payload);
     setAudioCodec((CodecType)payload); // codec builder for the mic
-	_debug("SetAUDIOcodec!!\n");
   }
   if (getAudioCodec() == (CodecType) -1) {
     _debug("SIPCall Failure: Unable to set codec\n");
-- 
GitLab