r3435 - in trunk/libminisip: include/libminisip/media include/libminisip/media/soundcard include/libminisip/media/video include/libminisip/signaling/sip source/subsystem_media source/subsystem_media/soundcard source/subsystem_media/video source/subsystem_signaling/sip

erik at minisip.org erik at minisip.org
Thu Oct 18 15:24:57 CEST 2007


Author: erik
Date: 2007-10-18 15:24:56 +0200 (Thu, 18 Oct 2007)
New Revision: 3435

Modified:
   trunk/libminisip/include/libminisip/media/AudioMedia.h
   trunk/libminisip/include/libminisip/media/Media.h
   trunk/libminisip/include/libminisip/media/MediaHandler.h
   trunk/libminisip/include/libminisip/media/MediaStream.h
   trunk/libminisip/include/libminisip/media/RtpReceiver.h
   trunk/libminisip/include/libminisip/media/soundcard/FileSoundSource.h
   trunk/libminisip/include/libminisip/media/soundcard/SoundSource.h
   trunk/libminisip/include/libminisip/media/video/VideoMedia.h
   trunk/libminisip/include/libminisip/signaling/sip/SipDialogVoip.h
   trunk/libminisip/source/subsystem_media/AudioMedia.cxx
   trunk/libminisip/source/subsystem_media/CallRecorder.cxx
   trunk/libminisip/source/subsystem_media/Media.cxx
   trunk/libminisip/source/subsystem_media/MediaHandler.cxx
   trunk/libminisip/source/subsystem_media/MediaStream.cxx
   trunk/libminisip/source/subsystem_media/RtpReceiver.cxx
   trunk/libminisip/source/subsystem_media/Session.cxx
   trunk/libminisip/source/subsystem_media/soundcard/FileSoundSource.cxx
   trunk/libminisip/source/subsystem_media/soundcard/SoundSource.cxx
   trunk/libminisip/source/subsystem_media/video/VideoMedia.cxx
   trunk/libminisip/source/subsystem_signaling/sip/DefaultDialogHandler.cxx
   trunk/libminisip/source/subsystem_signaling/sip/Sip.cxx
   trunk/libminisip/source/subsystem_signaling/sip/SipDialogVoip.cxx
Log:

  * Commited initial version of audio mixing+forwarding.
    (there is no jitter buffer before copying incoming
    audio data, and the forwarded data could therefore
    sound bad if there is a lot of jitter/reordering)

  * Made the objects handling incoming/outgoing audio
    aware of what session the audio belongs to. This
    is needed for audio bridging (to each participand,
    we must forward all incoming streams except the ones
    send from that participant).




Modified: trunk/libminisip/include/libminisip/media/AudioMedia.h
===================================================================
--- trunk/libminisip/include/libminisip/media/AudioMedia.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/media/AudioMedia.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -34,6 +34,8 @@
 #include<libminisip/media/aec/aec.h>		//hanning
 #endif
 
+#include<string>
+
 class AudioMediaSource;
 class SilenceSensor;
 class Resampler;
@@ -66,6 +68,9 @@
 		*/
 		virtual std::string getSdpMediaType();
 
+
+		void setAudioForwarding(bool);
+
 		/**
 		* Play the given RTP packet on this medium. This includes
 		* decoding if relevant.
@@ -97,7 +102,7 @@
 		* a different decoder.
 		* @param ssrc the SSRC identifier used by the new media source
 		*/
-		virtual void registerMediaSource( uint32_t ssrc );
+		virtual void registerMediaSource( uint32_t ssrc, std::string callId );
 
 
 		/**
@@ -170,12 +175,13 @@
 		#endif
 		std::list< MRef<AudioCodec *> > codecs;
 		std::list< MRef<AudioMediaSource *> > sources;
+		bool audioForwarding;
 		
 };
 
 class LIBMINISIP_API AudioMediaSource : public BasicSoundSource{
 	public:
-		AudioMediaSource( uint32_t ssrc, MRef<Media *> media );
+		AudioMediaSource( uint32_t ssrc, std::string callId, MRef<Media *> media );
 
 		void playData( MRef<RtpPacket *> rtpPacket );
 		uint32_t getSsrc();

Modified: trunk/libminisip/include/libminisip/media/Media.h
===================================================================
--- trunk/libminisip/include/libminisip/media/Media.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/media/Media.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -31,7 +31,6 @@
 #include<libmutil/MPlugin.h>
 #include<libmutil/MSingleton.h>
 
-#include<libminisip/media/soundcard/SoundRecorderCallback.h>
 #include<libminisip/media/soundcard/SoundIO.h>
 
 #include<libminisip/media/codecs/Codec.h>
@@ -43,6 +42,7 @@
 class MediaStreamReceiver;
 class SdpHeaderM;
 class SipSoftPhoneConfiguration;
+class MediaHandler;
 
 /**
  * The Media class is a representation of a medium type, namely
@@ -55,11 +55,14 @@
 class LIBMINISIP_API Media : public MObject{
 	public:
 
+		~Media();
+
 		/**
 		 * Returns the media type as used in the SDP (audio or video).
 		 * @returns the media type as a string
 		 */
 		virtual std::string getSdpMediaType()=0;
+
 		
 		/**
 		 * Returns a reference to the CODEC given its RTP
@@ -115,14 +118,14 @@
 		 * a different decoder.
 		 * @param ssrc the SSRC identifier used by the new media source
 		 */
-		virtual void registerMediaSource( uint32_t ssrc );
+		virtual void registerMediaSource( uint32_t ssrc, std::string callId )=0;
 		
 		/**
 		 * Used to unregister a media source when the session ends. 
 		 * @param ssrc the SSRC identifier used by the media source to
 		 * unregister
 		 */
-		virtual void unRegisterMediaSource( uint32_t ssrc );
+		virtual void unRegisterMediaSource( uint32_t ssrc)=0;
 		
 		/**
 		 * deprecated...
@@ -176,13 +179,16 @@
 		 * NULL if no CODEC with this payload type was available
 		 */
 		MRef<CodecState *> createCodecInstance( uint8_t payloadType );
+
+		void setMediaHandler(MRef<MediaHandler*> reg);
+		MRef<MediaHandler*> getMediaHandler();
 		
 	protected:
 		Media();
 		Media( MRef<Codec *> defaultCodec );
 
 		Media( std::list<MRef<Codec *> > codecList );
-				
+
 		std::list< MRef<Codec *> > codecList;
 		Mutex codecListLock;
 		
@@ -191,6 +197,7 @@
 		Mutex sourcesLock;
 		
 		std::list<std::string> sdpAttributes;
+		MRef<MediaHandler*> mediaHandler;
 };
 
 
@@ -220,3 +227,4 @@
 #endif
 
 #include<libminisip/signaling/sip/SipSoftPhoneConfiguration.h>
+#include<libminisip/media/MediaHandler.h>

Modified: trunk/libminisip/include/libminisip/media/MediaHandler.h
===================================================================
--- trunk/libminisip/include/libminisip/media/MediaHandler.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/media/MediaHandler.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -62,7 +62,7 @@
 		 * @param callId identifier shared with the SIP stack
 		 * @returns a reference to the session created
 		 */
-		MRef<Session *> createSession( MRef<SipIdentity*> ident, std::string callId = "" );
+		MRef<Session *> createSession( MRef<SipIdentity*> ident, std::string callId );
 		
 		/**
 		 * Registers a new media type (audio or video
@@ -86,7 +86,7 @@
 		 * @returns a string containing the IP address
 		 */
 		std::string getExtIP();
-		
+
                 /**
                  * Set the callback (interface) to Minisip's message router.
                  * 
@@ -138,6 +138,7 @@
 		MRef<SipSoftPhoneConfiguration *> config;
                 
                 MRef<CommandReceiver*> messageRouterCallback;
+
 		
 		/**
 		Looks for a Session with callid. If found, set the audio settings

Modified: trunk/libminisip/include/libminisip/media/MediaStream.h
===================================================================
--- trunk/libminisip/include/libminisip/media/MediaStream.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/media/MediaStream.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -45,6 +45,7 @@
 class UDPSocket;
 class SdpHeaderM;
 class IpProvider;
+class Media;
 
 /**
  * Abstract class that implements common functions to a
@@ -86,6 +87,8 @@
 		virtual std::string getMemObjectType() const {return "MediaStream";}
 		bool disabled;
 
+		std::string getCallId(){return callId;}
+
 		/**
 		 * Used to query the port on which the media is received for
 		 * a receiver, respectively where it is sent to for a sender
@@ -158,7 +161,8 @@
 
 	protected:
 		MRef<CryptoContext *> getCryptoContext( uint32_t ssrc, uint16_t seq_no );
-		MediaStream( MRef<Media *> );
+		MediaStream( std::string callId, MRef<Media *> );
+		std::string callId;
 		MRef<Media *> media;
 		uint32_t csbId;
 
@@ -193,7 +197,8 @@
 		 * used to obtain contact IP address and port in NAT
 		 * traversal mechanism
 		 */
-		MediaStreamReceiver( MRef<Media *> media,
+		MediaStreamReceiver( std::string callId,
+				MRef<Media *> media,
 				MRef<RtpReceiver *> rtpReceiver,
 				MRef<RtpReceiver *> rtp6Receiver = NULL );
 
@@ -236,7 +241,7 @@
 		 * playback.
 		 * @param packet the (S)RTP packet to handle
 		 */
-		virtual void handleRtpPacket( MRef<SRtpPacket *> packet, MRef<IPAddress *> from );
+		virtual void handleRtpPacket( MRef<SRtpPacket *> packet, std::string callId, MRef<IPAddress *> from );
 
 		/**
 		 * Returns a unique identifier for this Receiver. Used
@@ -288,7 +293,7 @@
 		uint32_t id;
 		uint16_t externalPort;
 
-		void gotSsrc( uint32_t ssrc );
+		void gotSsrc( uint32_t ssrc, std::string callId );
 
 		std::list<uint32_t> ssrcList;
 		Mutex ssrcListLock;
@@ -313,7 +318,8 @@
 		 * to which the data should be sent. If NULL a new one
 		 * is created
 		 */
-		MediaStreamSender( MRef<Media *> media,
+		MediaStreamSender( std::string callId,
+				   MRef<Media *> media,
 				   MRef<UDPSocket *> senderSock=NULL,
 				   MRef<UDPSocket *> sender6Sock=NULL );
 

Modified: trunk/libminisip/include/libminisip/media/RtpReceiver.h
===================================================================
--- trunk/libminisip/include/libminisip/media/RtpReceiver.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/media/RtpReceiver.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -53,7 +53,7 @@
 		 * on which the peer should send data (used by
 		 * NAT traversal mechanisms).
 		 */
-		RtpReceiver( MRef<IpProvider *> ipProvider );
+		RtpReceiver( MRef<IpProvider *> ipProvider, std::string callId );
 
 		/**
 		 * Used for a MediaStreamReceiver to subscribe to data
@@ -117,6 +117,8 @@
 		Mutex mediaStreamsLock;
 
 		Thread * thread;
+
+		std::string callId;
 };
 
 #endif

Modified: trunk/libminisip/include/libminisip/media/soundcard/FileSoundSource.h
===================================================================
--- trunk/libminisip/include/libminisip/media/soundcard/FileSoundSource.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/media/soundcard/FileSoundSource.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -54,7 +54,7 @@
          *                       is false.
 	 * @arg id               SoundSource id     
          */
-        FileSoundSource( std::string filename, uint32_t id, 
+        FileSoundSource( std::string callId, std::string filename, uint32_t id, 
 			uint32_t inputFreq,
 			uint32_t inputNChannels, 
 			uint32_t outputFreq,
@@ -76,7 +76,7 @@
          *                      all samples have been played. The default
          *                      is false.
          */
-        FileSoundSource(short *raw_audio, int samples, bool repeat=false);
+        FileSoundSource(std::string callId, short *raw_audio, int samples, bool repeat=false);
 
         /**
          * Note that if a audio buffer was given to the source when it was

Modified: trunk/libminisip/include/libminisip/media/soundcard/SoundSource.h
===================================================================
--- trunk/libminisip/include/libminisip/media/soundcard/SoundSource.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/media/soundcard/SoundSource.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -50,7 +50,32 @@
 */
 class LIBMINISIP_API SoundSource : public MObject{
 	public:
-		SoundSource(int id);
+		/**
+		 *
+		 * @param id ssrc of the system that generated the audio
+		 *
+		 * @param callId  Minisip can handle multiple simultaneous 
+		 * 	ongoing calls. It can be important to know to
+		 * 	what call a stream belongs such as if the UA
+		 * 	should mix incoming audio from one user (A) when
+		 * 	sending to another (B).
+		 * 	Example:
+		 *        ME is in a conference with A and B, and ME is
+		 *        supposed to act as a conference bridge mixing
+		 *        audio.
+		 *
+		 *            a         a+me
+		 * 	  A------->(ME)------->B
+		 * 	   <-------    <-------
+		 *            b+me         b
+		 *
+		 *      Note that media processing is different when having a 
+		 *      full mesh conference (then minsip handles multiple
+		 *      calls, and the media system is less complicated).
+		 *
+		 */
+		SoundSource(int id, std::string callId);
+
 		virtual ~SoundSource(){};
 		virtual std::string getMemObjectType() const {return "SoundSource";};
 
@@ -60,6 +85,12 @@
 		int getId();
 
 		/**
+		 * @return Identifier of call that the audio in the 
+		 *  	buffer belongs to.
+		 */
+		std::string getCallId(){return callid;}
+
+		/**
 		* @return Spatial position of the source.
 		*/
 		int32_t getPos();
@@ -166,6 +197,8 @@
 		int32_t k; //spaudio
 		
 		friend class SpAudio;
+
+		std::string callid;
 };
 
 /**
@@ -181,6 +214,7 @@
 		* @param id            Identifier of sound source that
 		*                      is generating audio for
 		*                      stream.
+		* @param callId	       see class SoundSource for details.
 		* @param pcl           Packet loss concealment provider. 
 		*                      The codec that is used
 		*                      to decode the audio data can 
@@ -192,6 +226,7 @@
 		* @param buffersize    Number of samples in buffer (per channel)
 		*/
 		BasicSoundSource(int32_t id,
+			std::string callId,
 			SoundIOPLCInterface *plc,
 			int32_t position,
 			uint32_t oFreq,

Modified: trunk/libminisip/include/libminisip/media/video/VideoMedia.h
===================================================================
--- trunk/libminisip/include/libminisip/media/video/VideoMedia.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/media/video/VideoMedia.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -61,7 +61,7 @@
 
 		virtual void registerMediaSender( MRef<MediaStreamSender *> sender );
 		virtual void unRegisterMediaSender( MRef<MediaStreamSender *> sender );
-		virtual void registerMediaSource( uint32_t ssrc );
+		virtual void registerMediaSource( uint32_t ssrc, std::string callId );
 		virtual void unRegisterMediaSource( uint32_t ssrc );
 		virtual void handleMHeader( MRef<SdpHeaderM *> m );
 

Modified: trunk/libminisip/include/libminisip/signaling/sip/SipDialogVoip.h
===================================================================
--- trunk/libminisip/include/libminisip/signaling/sip/SipDialogVoip.h	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/include/libminisip/signaling/sip/SipDialogVoip.h	2007-10-18 13:24:56 UTC (rev 3435)
@@ -63,6 +63,7 @@
 		virtual bool handleCommand(const SipSMCommand &command);
 
 	
+		void setMediaSession(MRef<Session*>s);
 		MRef<Session *> getMediaSession();
 
 	protected:

Modified: trunk/libminisip/source/subsystem_media/AudioMedia.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/AudioMedia.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/AudioMedia.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -73,13 +73,16 @@
 //                Media(codec),
 //                soundIo(soundIo){
 AudioMedia::AudioMedia( MRef<SoundIO *> soundIo_, 
-			std::list<MRef<Codec *> > codecList_ ):
+			std::list<MRef<Codec *> > codecList_):
 							Media(codecList_),
 							soundIo(soundIo_){
 						
 	// for audio media, we assume that we can both send and receive
 	receive = true;
 	send = true;
+
+	audioForwarding=false;
+
 	// pn430 Changed for multicodec
 	//MRef<AudioCodec *> acodec = ((AudioCodec *)*codec);
 	
@@ -96,6 +99,10 @@
         return "audio";
 }
 
+void AudioMedia::setAudioForwarding(bool b){
+	audioForwarding=b;
+}
+
 void AudioMedia::registerMediaSender( MRef<MediaStreamSender *> sender ){
 	sendersLock.lock();
 	if( senders.empty() ){
@@ -128,11 +135,10 @@
 	}
 }
 
-void AudioMedia::registerMediaSource( uint32_t ssrc ){
+void AudioMedia::registerMediaSource( uint32_t ssrc, string callId ){
 	MRef<AudioMediaSource *> source;
 
-	source = new AudioMediaSource( ssrc, this );
-	//cerr << "AudioMedia::registerMediaSource" << endl;
+	source = new AudioMediaSource( ssrc, callId, this );
 	soundIo->registerSource( *source );
 	sources.push_back( source );
 }
@@ -198,6 +204,8 @@
 	}
 	
 	list< MRef<MediaStreamSender *> >::iterator i;
+	list< MRef<MediaStreamReceiver *> >::iterator ir;
+	list< MRef<Session*> >::iterator is;
 	sendersLock.lock();
 
 	for( i = senders.begin(); i != senders.end(); i++ ){
@@ -216,12 +224,36 @@
 		}
 		
 		MRef<CodecState *> selectedCodec = (*(*i)->getSelectedCodec());
-			
+
 		//if we must send silence (zeroData), encode it ... 
 		if( encodeZeroData ) {
 			encodedLength = selectedCodec->encode( &zeroData, length, encoded );
 		} else {
-			encodedLength = selectedCodec->encode( data, length, encoded );
+
+
+			// If audio forwarding is enabled, then we need to
+			// connect the input of all other calls with the
+			// output that we are about to send. Here we do
+			// this by taking the last sample of audio received
+			// and add it to out output. 
+			// TODO: Copying the last received audio is not the
+			// optimal thing to do. We should have a jitter
+			// buffer that handled re-ordered packets and such.
+			if (audioForwarding){
+				std::list< MRef<AudioMediaSource *> >::iterator iSource;
+				for( iSource = sources.begin(); iSource != sources.end(); iSource ++ ){
+					if ( (*iSource)->getCallId()!= (*i)->getCallId() ){
+						short *stream = (*iSource)->getCodecOutputBuffer();
+						for (int ii=0; ii< length/2; ii++)
+							((short*)data)[ii] += stream[ii];
+						
+
+					}
+				}
+			}
+
+
+
 		}
 	
 		(*i)->send( encoded, encodedLength, &givenTs, marker );
@@ -231,7 +263,7 @@
 }
 
 void AudioMedia::startRinging( string ringtoneFile ){
-	soundIo->registerSource( new FileSoundSource( ringtoneFile,RINGTONE_SOURCE_ID, 44100, 2, SOUND_CARD_FREQ, 20, 2, true ) );
+	soundIo->registerSource( new FileSoundSource( "", ringtoneFile,RINGTONE_SOURCE_ID, 44100, 2, SOUND_CARD_FREQ, 20, 2, true ) );
 }
 
 void AudioMedia::stopRinging(){
@@ -262,8 +294,9 @@
 }
 
 
-AudioMediaSource::AudioMediaSource( uint32_t ssrc_, MRef<Media *> m):
+AudioMediaSource::AudioMediaSource( uint32_t ssrc_, string callId, MRef<Media *> m):
 	BasicSoundSource( ssrc_, 
+			callId,
 			NULL, //plc
 			0/*position*/, 
 			SOUND_CARD_FREQ, 
@@ -287,6 +320,7 @@
 			outputSize, hdr.getSeqNo() );
 		
         }
+
 }
 
 MRef<CodecState *> AudioMediaSource::findCodec( uint8_t payloadType ){

Modified: trunk/libminisip/source/subsystem_media/CallRecorder.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/CallRecorder.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/CallRecorder.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -41,7 +41,7 @@
 CallRecorder::CallRecorder(  MRef<AudioMedia *> aMedia, 
 				MRef<RtpReceiver *> rtpReceiver_,
 				MRef<IpProvider *> ipProvider ):
-		MediaStreamReceiver( (Media *)*aMedia, rtpReceiver_ ),
+		MediaStreamReceiver( "callrecorder", (Media *)*aMedia, rtpReceiver_ ),
 		enabledMic(false),
 		enabledNtwk(false),
 		fileDev( NULL ),

Modified: trunk/libminisip/source/subsystem_media/Media.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/Media.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/Media.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -48,7 +48,7 @@
 // pn430 Function rewritten for multicodec
 //Media::Media( MRef<Codec *> codec ):codec(codec){
 //}
-Media::Media( MRef<Codec *> codec ){
+Media::Media(MRef<Codec *> codec ){
 	codecList.push_back(codec);
 	//selectedCodec = codec;
 }
@@ -59,7 +59,20 @@
 	//selectedCodec = defaultCodec;
 }
 
+Media::~Media(){
 
+}
+
+void Media::setMediaHandler(MRef<MediaHandler*> reg){
+	mediaHandler=reg;
+}
+
+MRef<MediaHandler*> Media::getMediaHandler(){
+	return mediaHandler;
+}
+
+
+
 // pn507 Added for being able to change the current codec
 // pn507 NOTE Using this during a conference call will most likely cause complete havoc.
 MRef<Codec *> Media::getCodec( uint8_t payloadType ){
@@ -95,11 +108,13 @@
 	sendersLock.unlock();
 }
 
+#if 0
 void Media::registerMediaSource( uint32_t ssrc ){
 }
 
 void Media::unRegisterMediaSource( uint32_t ssrc ){
 }
+#endif
 
 void Media::sendData( byte_t * data, uint32_t length, uint32_t ts, bool marker ){
 	list< MRef<MediaStreamSender *> >::iterator i;

Modified: trunk/libminisip/source/subsystem_media/MediaHandler.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/MediaHandler.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/MediaHandler.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -45,6 +45,7 @@
 #include<libminisip/media/codecs/Codec.h>
 
 #include<libminisip/media/CallRecorder.h>
+#include<libminisip/media/SessionRegistry.h>
 
 #ifdef _WIN32_WCE
 #	include"../include/minisip_wce_extra_includes.h"
@@ -79,6 +80,8 @@
 			MRef<Media *> m = mediaPlugin->createMedia( config );
 			MRef<AudioMedia *> audio = dynamic_cast<AudioMedia *>( *m );
 
+			m->setMediaHandler(this);
+
 			if( m ){
 				registerMedia( m );
 			}
@@ -120,13 +123,13 @@
 
 		if( m->receive ){
 			if( ipProvider )
-				rtpReceiver = new RtpReceiver( ipProvider );
+				rtpReceiver = new RtpReceiver( ipProvider, callId );
 
 			if( ip6Provider )
-				rtp6Receiver = new RtpReceiver( ip6Provider );
+				rtp6Receiver = new RtpReceiver( ip6Provider, callId );
 
 			MRef<MediaStreamReceiver *> rStream;
-			rStream = new MediaStreamReceiver( m, rtpReceiver, rtp6Receiver );
+			rStream = new MediaStreamReceiver( callId, m, rtpReceiver, rtp6Receiver );
 			session->addMediaStreamReceiver( rStream );
 			if( (*i) == this->audioMedia ) {
 				CallRecorder * cr;
@@ -148,11 +151,11 @@
 		
 		if( m->send ){
 		    if( !rtpReceiver && !ipProvider.isNull() ){
-			rtpReceiver = new RtpReceiver( ipProvider );
+			rtpReceiver = new RtpReceiver( ipProvider, callId );
 		    }
 
 		    if( !rtp6Receiver && !ip6Provider.isNull() ){
-		      rtp6Receiver = new RtpReceiver( ip6Provider );
+		      rtp6Receiver = new RtpReceiver( ip6Provider, callId );
 		    }
 
 		    MRef<UDPSocket *> sock;
@@ -164,7 +167,7 @@
 			    sock6 = rtp6Receiver->getSocket();
 
 		    MRef<MediaStreamSender *> sStream;
-		    sStream = new MediaStreamSender( m, sock, sock6 );
+		    sStream = new MediaStreamSender( callId, m, sock, sock6 );
 		    session->addMediaStreamSender( sStream );
 #ifdef ZRTP_SUPPORT
 		    if(/*securityConfig.use_zrtp*/ id->use_zrtp) {
@@ -225,6 +228,17 @@
 	#endif
 		return;
 	}
+
+	if( command.getOp() == MediaCommandString::audio_forwarding_enable){
+		audioMedia->setAudioForwarding(true);
+		return;
+	}
+
+	if( command.getOp() == MediaCommandString::audio_forwarding_disable){
+		audioMedia->setAudioForwarding(false);
+		return;
+	}
+
 	
 	if( command.getOp() == MediaCommandString::set_session_sound_settings ){
 		bool turnOn;

Modified: trunk/libminisip/source/subsystem_media/MediaStream.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/MediaStream.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/MediaStream.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -47,7 +47,7 @@
 
 using namespace std;
 
-MediaStream::MediaStream( MRef<Media *> m):media(m),ka(NULL) {
+MediaStream::MediaStream( string cid, MRef<Media *> m) : callId(cid), media(m),ka(NULL) {
 	disabled = false;
 #ifdef ZRTP_SUPPORT
 	zrtpBridge = NULL;
@@ -277,10 +277,10 @@
 
 #endif
 
-MediaStreamReceiver::MediaStreamReceiver( MRef<Media *> m,
+MediaStreamReceiver::MediaStreamReceiver( string callid, MRef<Media *> m,
 		MRef<RtpReceiver *> rtpRecv, 
 		MRef<RtpReceiver *> rtp6Recv ):
-			MediaStream( m ),
+			MediaStream( callid,  m ),
 			rtpReceiver( rtpRecv ),
 			rtp6Receiver( rtp6Recv ){
 	id = rand();
@@ -295,8 +295,9 @@
 
 void MediaStreamReceiver::start(){
 	if( !running ){
-		if( rtpReceiver )
+		if( rtpReceiver ){
 			rtpReceiver->registerMediaStream( this );
+		}
 		if( rtp6Receiver )
 			rtp6Receiver->registerMediaStream( this );
 		running = true;
@@ -358,7 +359,7 @@
 }
 #endif
 
-void MediaStreamReceiver::handleRtpPacket( MRef<SRtpPacket *> packet, MRef<IPAddress *> from ){
+void MediaStreamReceiver::handleRtpPacket( MRef<SRtpPacket *> packet, string callId, MRef<IPAddress *> from ){
 	uint32_t packetSsrc;
 	uint16_t seq_no;
 
@@ -406,12 +407,12 @@
 	//bool marker = packet->getHeader().getMarker(); //not used
 	//uint32_t ts = packet->getHeader().getTimestamp(); //not used
 
-	gotSsrc( packetSsrc );
+	gotSsrc( packetSsrc, callId );
 
 	media->playData( *packet );
 }
 
-void MediaStreamReceiver::gotSsrc( uint32_t ssrc ){
+void MediaStreamReceiver::gotSsrc( uint32_t ssrc, string callId ){
 	list<uint32_t>::iterator i;
 
 	ssrcListLock.lock();
@@ -422,7 +423,8 @@
 		}
 	}
 
-	media->registerMediaSource( ssrc );
+	massert(callId.size()>0);
+	media->registerMediaSource( ssrc, callId );
 	ssrcList.push_back( ssrc );
 	ssrcListLock.unlock();
 }
@@ -441,10 +443,10 @@
 }
 
 
-MediaStreamSender::MediaStreamSender( MRef<Media *> m, 
+MediaStreamSender::MediaStreamSender( string callid, MRef<Media *> m, 
 		MRef<UDPSocket *> senderSocket, 
 		MRef<UDPSocket *> sender6Socket ):
-			MediaStream( m ){
+			MediaStream( callid, m ){
 	selectedCodec = NULL;
 	remotePort = 0;
 	seqNo = (uint16_t)rand();

Modified: trunk/libminisip/source/subsystem_media/RtpReceiver.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/RtpReceiver.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/RtpReceiver.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -65,7 +65,8 @@
 
 using namespace std;
 
-RtpReceiver::RtpReceiver( MRef<IpProvider *> ipProvider){
+RtpReceiver::RtpReceiver( MRef<IpProvider *> ipProvider, string cid) : callId(cid)
+{
 
 	socket = NULL;
 
@@ -235,7 +236,7 @@
 			//notify the mediaStreams of the timeout
 			for( i = mediaStreams.begin();
 					i != mediaStreams.end(); i++ ){
-				(*i)->handleRtpPacket( NULL, NULL );
+				(*i)->handleRtpPacket( NULL, callId, NULL );
 			}
 			continue;
 		}
@@ -260,7 +261,7 @@
 			//printf( "|" );
                     for( iC = codecs.begin(); iC != codecs.end(); iC ++ ){
                         if ( (*iC)->getSdpMediaType() == packet->getHeader().getPayloadType() ) {
-                            (*i)->handleRtpPacket( packet, from );
+                            (*i)->handleRtpPacket( packet, callId, from );
                             found = 1;
                             //printf( "~" );
                             break;

Modified: trunk/libminisip/source/subsystem_media/Session.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/Session.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/Session.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -1066,7 +1066,9 @@
 		ret += "\n          ";
 		cr = dynamic_cast<CallRecorder *>( *callRecorder );
 		ret += "; " + cr->getDebugString();
-	}	
+	}else
+		ret += "\n          (no call recorder)";
+
 	for( std::list< MRef<MediaStreamReceiver *> >::iterator it = mediaStreamReceivers.begin();
 				it != mediaStreamReceivers.end(); it++ ) {
 		ret += "\n          " + (*it)->getDebugString();

Modified: trunk/libminisip/source/subsystem_media/soundcard/FileSoundSource.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/soundcard/FileSoundSource.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/soundcard/FileSoundSource.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -29,7 +29,7 @@
 
 using namespace std;
 
-FileSoundSource::FileSoundSource(string filename, 
+FileSoundSource::FileSoundSource(string callId, string filename, 
 					uint32_t id, 
 					uint32_t inputFreq,
 					uint32_t inputNChannels,
@@ -37,7 +37,7 @@
 					uint32_t outputDurationMs,
 					uint32_t outputNChannels,
 					bool rep):
-					SoundSource(id), 
+					SoundSource( id, callId ), 
 					enabled(false),
 					repeat(rep),
 					index(0) {
@@ -105,10 +105,10 @@
 }
 
 
-FileSoundSource::FileSoundSource(short *rawaudio, 
+FileSoundSource::FileSoundSource(string callid, short *rawaudio, 
 					int samples, 
 					bool rep):
-							SoundSource(0),
+							SoundSource(0,callid),
 							audio(rawaudio),
 							nSamples(samples),
 							enabled(false),

Modified: trunk/libminisip/source/subsystem_media/soundcard/SoundSource.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/soundcard/SoundSource.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/soundcard/SoundSource.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -37,7 +37,7 @@
 
 using namespace std;
 
-SoundSource::SoundSource(int id):sourceId(id){
+SoundSource::SoundSource(int id, string cId):sourceId(id),callid(cId){
 // 	leftch = NULL;
 // 	rightch = NULL;
 // 	lookupright = NULL;
@@ -63,12 +63,13 @@
 }
 
 BasicSoundSource::BasicSoundSource(int32_t id,
+				string callId,
 				SoundIOPLCInterface *plc,
 				int32_t position,
 				uint32_t oFreq,
 				uint32_t oDurationMs,
 				uint32_t oNChannels):
-		SoundSource(id),
+		SoundSource(id, callId),
 		plcProvider(plc)   {
 	this->oNChannels = oNChannels;
         

Modified: trunk/libminisip/source/subsystem_media/video/VideoMedia.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/video/VideoMedia.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_media/video/VideoMedia.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -102,7 +102,7 @@
         Media::sendData( data, length, ts, marker );
 }
 
-void VideoMedia::registerMediaSource( uint32_t ssrc ){
+void VideoMedia::registerMediaSource( uint32_t ssrc, string callId ){
 	MRef<VideoMediaSource *> source;
 
 	source = new VideoMediaSource( ssrc, receivingWidth, receivingHeight );

Modified: trunk/libminisip/source/subsystem_signaling/sip/DefaultDialogHandler.cxx
===================================================================
--- trunk/libminisip/source/subsystem_signaling/sip/DefaultDialogHandler.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_signaling/sip/DefaultDialogHandler.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -601,10 +601,14 @@
 		id->unlock();
 	}
 
-	MRef<Session *> mediaSession = mediaHandler->createSession( id );
 	
-	MRef<SipDialog*> voipCall = new SipDialogVoipClient(sipStack, id, phoneconf->useSTUN, phoneconf->useAnat, mediaSession); 
-	sipStack->addDialog(voipCall);
+	MRef<SipDialogVoip*> voipCall = new SipDialogVoipClient(sipStack, id, phoneconf->useSTUN, phoneconf->useAnat, NULL); 
+
+	MRef<Session *> mediaSession = mediaHandler->createSession( id, voipCall->getCallId() );
+	voipCall->setMediaSession( mediaSession );
+
+	sipStack->addDialog(*voipCall);
+
 	CommandString inv(voipCall->getCallId(), SipCommandString::invite, user);
 #ifdef ENABLE_TS
 	ts.save( TMP );

Modified: trunk/libminisip/source/subsystem_signaling/sip/Sip.cxx
===================================================================
--- trunk/libminisip/source/subsystem_signaling/sip/Sip.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_signaling/sip/Sip.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -171,7 +171,7 @@
 
 
 	MRef<Session *> mediaSession = 
-		mediaHandler->createSession( /*securityConfig*/ identity );
+		mediaHandler->createSession( /*securityConfig*/ identity, "" );
 
 	MRef<SipDialog*> voipConfCall( new SipDialogConfVoip(dynamic_cast<ConfMessageRouter*>(*sipstack->getConfCallback()), sipstack, identity, phoneconfig, mediaSession, conflist, confId, "")); 
 
@@ -260,7 +260,7 @@
 
 
 MRef<Session *> mediaSession = 
-		mediaHandler->createSession( /*securityConfig*/ identity );
+		mediaHandler->createSession( /*securityConfig*/ identity, "" );
 
 	MRef<SipDialog*> voipConfCall( new SipDialogConfVoip(dynamic_cast<ConfMessageRouter*>(*sipstack->getConfCallback()), sipstack, identity, phoneconfig, mediaSession, confId)); 
 

Modified: trunk/libminisip/source/subsystem_signaling/sip/SipDialogVoip.cxx
===================================================================
--- trunk/libminisip/source/subsystem_signaling/sip/SipDialogVoip.cxx	2007-10-17 05:52:51 UTC (rev 3434)
+++ trunk/libminisip/source/subsystem_signaling/sip/SipDialogVoip.cxx	2007-10-18 13:24:56 UTC (rev 3435)
@@ -737,6 +737,10 @@
 	return mediaSession;
 }
 
+void SipDialogVoip::setMediaSession(MRef<Session*> s){
+	mediaSession=s;
+}
+
 bool SipDialogVoip::sortMIME(MRef<SipMessageContent *> Offer, string peerUri, int type){
 	if (Offer){
 		if ( Offer->getContentType().substr(0,9) == "multipart"){



More information about the Minisip-devel mailing list