multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TCmdSendStreamDtmf.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TCmdSendStreamDtmf.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,159 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:    Implementation
+*
+*/
+
+
+
+#include "MCEConstants.h"
+#include "TCmdSendStreamDtmf.h"
+#include "CTcMCEContext.h"
+
+#include <MCESession.h>
+#include <MceMediaStream.h>
+#include <MceMediaSource.h>
+#include <MceRtpSource.h>
+#include <MceAudioStream.h>
+
+#include <MCEAudioCodec.h>
+#include <MceDtmfCodec.h>
+
+const TUint KDtmfAudioPriority					= 45;
+const TUint KDtmfAudioPref						= 0x00150001;
+
+_LIT( KTestSequence, "0123456789abcd*#");
+				
+void TCmdSendStreamDtmf::ExecuteL()
+	{	
+	// ---------- Setup --------------------------------------------------------
+
+// DTMF out-of-band means DTMF tones are sent as the numerical value in a packet
+// (RTP type telephone-event, refer RFC2833).
+
+	const TInt KDefaultDuration = 0;
+
+		// Get session
+	CMceSession* session = 
+		reinterpret_cast<CMceSession*>(GetObjectForIdL(KSessionId, ETrue));
+		
+	TPtrC8 dtmfTones = ExtractTextL( KParamDtmfTones, EFalse );
+	TInt dtmfDuration = ExtractIntegerL( KParamDtmfDuration, KDefaultDuration, EFalse );
+	TBool isSingleTone = ExtractBooleanL( KParamDtmfIsSingleTone, EFalse );
+
+	const RPointerArray<CMceMediaStream>& streams = session->Streams();	
+	
+	for ( TInt i = 0; i < streams.Count(); ++i )
+        {                
+        CMceMediaStream* mediaStream;
+        mediaStream = streams[i];
+        
+        if ( mediaStream->Type() == KMceAudio && mediaStream->Source()->Type() == KMceRTPSource )
+        	{
+            CMceAudioStream* audioStream = dynamic_cast<CMceAudioStream*>(mediaStream);
+            
+            const RPointerArray<CMceAudioCodec>& codecsMain =  audioStream->Codecs();
+            
+            TBool dtmfFound = EFalse;
+            for (TInt i = codecsMain.Count()-1; dtmfFound == EFalse && i >= 0;  i --)
+				{
+				if ( codecsMain[i]->SdpName().Compare(KValueCodecDtmf()))
+					{
+					//TODO modify dtmf codec 
+					codecsMain[i]->SetMMFPriorityL( KDtmfAudioPriority );
+	   			 	codecsMain[i]->SetMMFPriorityPreferenceL( KDtmfAudioPref );	
+		   			codecsMain[i]->SetPreferenceL(0);
+	   			 	dtmfFound = ETrue;
+		   			 	   			 
+					}
+				}
+            //getting the media source pointer from the audio stream;
+            CMceMediaSource* dtmfSource = audioStream->Source();
+			//checking if dtmf is available
+			if(dtmfSource->DtmfAvailable() && (!dtmfSource->DtmfActive()) )
+				{
+				//sending dtmf tones
+				if( dtmfTones.Compare( KNullDesC8 ) != 0 )
+					{
+					HBufC* buf = HBufC::NewLC(dtmfTones.Length());
+                    buf->Des().Copy(dtmfTones);
+					
+					if( isSingleTone && dtmfDuration > 0)
+						{
+						TLex lexer( *buf );
+						TChar tone = lexer.Get();
+						//starts sending the tone
+						dtmfSource->StartDtmfToneL( tone );
+						
+						iDtmfTimer = NULL;
+						//create instance of timer to stop sending the tone after given duration
+						iDtmfTimer = CDelayedProcess::NewL(dtmfSource);
+							
+						if(iDtmfTimer)
+							{
+							TTimeIntervalMicroSeconds32 delay = dtmfDuration * 1000;
+							iDtmfTimer->StartProcess(delay);
+							}
+						}					
+					else if( !isSingleTone )
+						{
+						iDtmfTimer = NULL;
+						dtmfSource->SendDtmfToneSequenceL(*buf);	
+						}
+														
+					iaudioStream = audioStream;
+					CleanupStack::PopAndDestroy(buf);
+					buf = NULL;					
+					}
+				else
+					{
+					//send default sequence if not present in the params
+					dtmfSource->SendDtmfToneSequenceL(KTestSequence);
+					iaudioStream = audioStream;
+					}
+				
+				}
+        	//stop sending dtmf        	
+        	if( dtmfSource->DtmfActive() && ( !isSingleTone ) )
+	        	{
+	        	dtmfSource->CancelDtmfToneSequenceL();
+	        	}
+        	}
+        }
+
+
+		
+	// ---------- Response creation --------------------------------------------
+    if(iaudioStream)
+	    {
+	    AddIdResponseL( KStreamId, *iaudioStream );
+		AddTextResponseL( KParamDtmfTones, dtmfTones );
+		AddIntegerResponseL( KResponseLocalMediaPort, 
+						 iaudioStream->LocalMediaPort() );		
+	    }
+    else
+	    {
+	    AddIntegerResponseL(KResponseActionReturnCode, KErrArgument);
+	    }
+	}
+	
+TBool TCmdSendStreamDtmf::Match( const TTcIdentifier& aId )
+	{
+	return TTcMceCommandBase::Match( aId, _L8("SendStreamDtmf") );
+	}
+
+TTcCommandBase* TCmdSendStreamDtmf::CreateL( MTcTestContext& aContext )
+	{
+	return new( ELeave ) TCmdSendStreamDtmf( aContext );
+	}