bluetoothengine/btaudiostreamer/src/btaudiostreamer.cpp
changeset 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btaudiostreamer/src/btaudiostreamer.cpp	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,197 @@
+/*
+* 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:  Contains an implementation of CBTAudioStreamer class.
+*
+*/
+
+
+#include <bt_sock.h> 
+#include <in_sock.h>
+
+#include "btaudiostreamerdebug.h" 
+#include "btaudiostreamer.h"
+#include "btaudiostreamsender.h"
+
+const TInt KL2CAPDefaultMTUSize = 672; 
+
+// ---------------------------------------------------------------------------
+// Constructor. 
+// ---------------------------------------------------------------------------
+//
+CBTAudioStreamer::CBTAudioStreamer() : iStarted(EFalse)  
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::CBTAudioStreamer() ->")));
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::CBTAudioStreamer() <-")));
+    }
+
+// ---------------------------------------------------------------------------
+// Static factory method. 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CBTAudioStreamer* CBTAudioStreamer::NewL()
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::NewL() ->")));
+    CBTAudioStreamer* self = new (ELeave) CBTAudioStreamer();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::NewL() <-")));
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian OS second phase contruction. 
+// ---------------------------------------------------------------------------
+//
+void CBTAudioStreamer::ConstructL()
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::ConstructL() ->")));
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::ConstructL() <-")));
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor. 
+// ---------------------------------------------------------------------------
+//
+CBTAudioStreamer::~CBTAudioStreamer()
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::~CBTAudioStreamer() ->")));
+    Stop(); 
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::~CBTAudioStreamer() <-")));
+    }
+
+// ---------------------------------------------------------------------------
+// This method prepares the streamer for incoming data. 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CBTAudioStreamer::SetNewFrameLength(const TUint aFrameLength, const TUint aTargetBitrate) 
+{
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::SetNewFrameLength() ->")));
+	TInt retVal = KErrGeneral; 
+	if(iStarted != EFalse) 
+		{
+	    TInt outboundMTUSize; 
+	//  if(aSocket.GetOpt(KL2CAPGetOutboundMTU, KSolBtL2CAP, outboundMTUSize) != KErrNone) 
+	        {
+	        BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t Failed to get outbound MTU size, using L2CAP default value")));
+	        outboundMTUSize = KL2CAPDefaultMTUSize; 
+	        }
+		retVal = iSender->SetNewFrameLength(outboundMTUSize, aFrameLength, aTargetBitrate); 
+		}
+	else 
+		{
+	    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t Error: Not started!")));
+	    retVal = KErrNotReady; 
+		}
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::SetNewFrameLength() <-")));
+	return retVal; 
+}
+
+// ---------------------------------------------------------------------------
+// This method prepares the streamer for incoming data. 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CBTAudioStreamer::StartL(RSocket& aSocket, const TUint aFrameLength, CBTAudioStreamInputBase *aAudioInput, const TUint aTargetBitrate)
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::StartL() ->")));
+    iAudioInput = aAudioInput; 
+
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FPrint(_L("[BTAudioStreamer]\t Framelength: %d"), aFrameLength));
+
+    if(iStarted != EFalse) 
+        {
+        BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t Error: Already started!")));
+        User::Leave(KErrInUse); 
+        }
+
+    TInt inboundMTUSize = 0; 
+    if(aSocket.GetOpt(KL2CAPInboundMTU, KSolBtL2CAP, inboundMTUSize) != KErrNone) 
+        {
+        BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t Failed to get inbound MTU size, using L2CAP default value")));
+        inboundMTUSize = KL2CAPDefaultMTUSize; 
+        }
+
+    iRtpSession.OpenL(aSocket, inboundMTUSize); 
+    iSender = CBTAudioStreamSender::NewL(*this, iRtpSession); 
+
+    TInt outboundMTUSize; 
+    if(aSocket.GetOpt(KL2CAPGetOutboundMTU, KSolBtL2CAP, outboundMTUSize) != KErrNone) 
+        {
+        BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t Failed to get outbound MTU size, using L2CAP default value")));
+        outboundMTUSize = KL2CAPDefaultMTUSize; 
+        }
+
+    iSender->StartL(outboundMTUSize, aFrameLength, aTargetBitrate); 
+
+		iStarted = ETrue; 
+		
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::StartL() <-")));
+    }
+
+// ------------------------------------------------------------------------------------------
+// This method cleans up the streamer and releases the resources it reserved for streaming. 
+// ------------------------------------------------------------------------------------------
+//
+EXPORT_C void CBTAudioStreamer::Stop()
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::Stop() ->")));
+    
+    if(iStarted != EFalse) // Don't delete things unless we have started, thus created those. 
+        {
+        if(iSender) 
+            {
+            BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t Stopping and deleting the stream sender.")));
+            iSender->Stop();
+            delete iSender; 
+            iSender = NULL; 
+            }
+        else 
+            {
+            BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t Error! Stream sender was deleted while the streamer was running!")));
+            }
+
+        BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t Closing RTP session.")));
+        iRtpSession.Close(); 
+        }
+
+    iAudioInput = NULL; 
+	iStarted = EFalse;
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::Stop() <-")));
+    }
+
+TInt CBTAudioStreamer::Receive(const TDesC8& /*aBuffer*/)
+    {
+    return KErrNotSupported; 
+    }
+
+TInt CBTAudioStreamer::Receive(const TDesC8& aBuffer, TTimeIntervalMicroSeconds aTimestamp)
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::Receive() ->")));
+    TInt retval = iSender->SendThisBuffer(aBuffer, aTimestamp); 
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::Receive() <-")));
+    return retval; 
+    }
+
+void CBTAudioStreamer::NotifyBufferSent( const TDesC8 &aBuffer ) 
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::NotifyBufferSent() ->")));
+    if(iAudioInput) iAudioInput->BufferEmptied(aBuffer); 
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::NotifyBufferSent() <-")));
+    }
+
+void CBTAudioStreamer::NotifyErrorSending( const TDesC8 &/*aBuffer*/ ) 
+    {
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::NotifyErrorSending() ->")));
+    BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamer::NotifyErrorSending() <-")));
+    }