mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/AdvancedAudioController/Src/AdvancedAudioEncoder.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/AdvancedAudioController/Src/AdvancedAudioEncoder.cpp Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,229 @@
+/*
+* Copyright (c) 2004 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: The functions in this module implements the common behavior
+* for the audio encoder base class.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "AdvancedAudioEncoder.h"
+#include <mmfdatabuffer.h>
+#include "DebugMacros.h"
+
+// CONSTANTS
+const TInt KEmptyBuffer = 1;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAdvancedAudioEncoder::CAdvancedAudioEncoder(TInt aPriority)
+ : CActive(aPriority),
+ iState(EIdle),
+ iSharedBuffers(NULL),
+ iMMFDevSound(NULL),
+ iObserver(NULL)
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CAdvancedAudioEncoder::CAdvancedAudioEncoder()"));
+#endif
+ }
+
+// Destructor
+EXPORT_C CAdvancedAudioEncoder::~CAdvancedAudioEncoder()
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CAdvancedAudioEncoder::~CAdvancedAudioEncoder()"));
+#endif
+ }
+
+// -----------------------------------------------------------------------------
+// CAdvancedAudioEncoder::SetDevSound
+// Sets the DevSound instance.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::SetDevSound(
+ CMMFDevSound& aDevSound )
+ {
+ iMMFDevSound = &aDevSound;
+ }
+
+// -----------------------------------------------------------------------------
+// CAdvancedAudioEncoder::SetObserver
+// Sets the observer instance.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::SetObserver(
+ MAdvancedAudioEncoderObserver& aObserver )
+ {
+ iObserver = &aObserver;
+ }
+
+// -----------------------------------------------------------------------------
+// CAdvancedAudioEncoder::SetSinkBuffers
+// Sets the sink buffer for encoding operations.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::SetSinkBuffers(
+ RPointerArray<CMMFDataBuffer>* aBuffers )
+ {
+ iSharedBuffers = aBuffers;
+ }
+
+// -----------------------------------------------------------------------------
+// CAdvancedAudioEncoder::EmptyBuffer
+// Request to fill the specified buffer with converted data.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::EmptyBuffer(
+ CMMFBuffer* aBuffer)
+ {
+#ifdef _DEBUG
+// RDebug::Print(_L("CAdvancedAudioEncoder::EmptyBuffer"));
+#endif
+ iBufferToEmpty = aBuffer; // store away the buffer
+ iState = EEncoding;
+
+ iRequest = KEmptyBuffer;
+ Ready(KErrNone);
+ SetActive();
+ }
+
+// -----------------------------------------------------------------------------
+// CAdvancedAudioEncoder::Stop
+// Stops encoding process.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::Stop()
+ {
+ DP1(_L("CAdvancedAudioEncoder::Stop start iNextBuffer[%d]"), iNextBuffer);
+
+ // There are 2 situations in which this function is called.
+ // First when Devsound has already given a buffer to Encoder to be handled.
+ // In which case, one needs to finish handling it by calling HandleEmptyBufferL().
+ // Secondly, in a situation where the current shared buffer is being filled (partially full)
+ // in which case, the buffer needs to be flushed
+ if (iBufferToEmpty && (iState == EEncoding))
+ {
+ DP1(_L("CAdvancedAudioEncoder::Stop setting last buffer[%d]"), iBufferToEmpty);
+ iBufferToEmpty->SetLastBuffer(ETrue);
+ TRAPD(err, HandleEmptyBufferL());
+ if ( err )
+ {
+ DP1(_L("CAdvancedAudioEncoder::Stop err[%d]"), err);
+ iState = EIdle;
+ iObserver->SendEvent(TMMFEvent(KMMFEventCategoryPlaybackComplete, err));
+ }
+ }
+ else if (iNextBuffer)
+ { // a record controller may call stop before buffers are initialized
+ if (iNextBuffer->Status() == EBeingFilled)
+ {
+ DP1(_L("CAdvancedAudioEncoder::Stop setting buffer[%d] to EFull"), iNextBuffer);
+ iNextBuffer->SetStatus(EFull);
+ DP1(_L("CAdvancedAudioEncoder::Stop emptying buffer[%d]"), iNextBuffer);
+ iObserver->EmptyBuffer(iNextBuffer);
+ }
+ }
+
+ iState = EIdle;
+ DP0(_L("CAdvancedAudioEncoder::Stop end"));
+ }
+
+// -----------------------------------------------------------------------------
+// CAdvancedAudioEncoder::Ready
+// Utility function to post a request complete
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::Ready(
+ const TInt aStatus)
+ {
+ TRequestStatus* stat = &iStatus;
+ User::RequestComplete(stat, aStatus);
+ }
+
+// -----------------------------------------------------------------------------
+// CDevSoundAudioInput::NextSharedBufferL
+// Determine the next available shared buffer from the pool of shared buffers
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::NextSharedBufferL()
+ {
+ if ( (*iSharedBuffers)[iSharedBufferIndex]->Status() == EAvailable )
+ {
+ iNextBuffer = (*iSharedBuffers)[iSharedBufferIndex];
+ iSharedBufferIndex++;
+ if ( iSharedBufferIndex == iSharedBuffers->Count() )
+ {
+ iSharedBufferIndex = 0;
+ }
+ }
+ else
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CAdvancedAudioEncoder::NextSharedBufferL - KErrOverflow"));
+#endif
+ User::Leave(KErrOverflow);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CAdvancedAudioEncoder::RunL
+// Invoke by the active scheduler when a request completes
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::RunL()
+ {
+#ifdef _DEBUG
+// RDebug::Print(_L("CAdvancedAudioEncoder::RunL"));
+#endif
+ switch(iRequest)
+ {
+ case KEmptyBuffer:
+ if ( iState == EEncoding )
+ {
+ TRAPD(err, HandleEmptyBufferL());
+ if ( err )
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CAdvancedAudioEncoder::RunL err[%d]"), err);
+#endif
+ // if error is encountered, the state is reset and event is generated and the recording is stopped.
+ //err = KErrDied;
+ iState = EIdle;
+ iObserver->SendEvent(TMMFEvent(KMMFEventCategoryPlaybackComplete, err));
+ }
+ }
+ break;
+
+ default:
+ break;
+ };
+ }
+
+// -----------------------------------------------------------------------------
+// CAdvancedAudioEncoder::DoCancel
+// Cancels the current and any on going requests/tasks.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAdvancedAudioEncoder::DoCancel()
+ {
+ }
+
+// End of file