devsound/devsoundrefplugin/src/swcodecwrapper/mmfswaudioinputpriv.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/devsoundrefplugin/src/swcodecwrapper/mmfswaudioinputpriv.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,207 @@
+// Copyright (c) 2003-2009 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:
+// mmfswaudioinputpriv.h
+// 
+//
+
+#ifndef SWAUDIOINPUTPRIV_H
+#define SWAUDIOINPUTPRIV_H
+
+#include <e32def.h>
+#include "mmfswaudioinput.h"
+#include <d32soundsc.h>
+#include <e32base.h>
+#include <e32std.h>
+
+#define KNumRecorders (2) // 2 for double buffering, 4 quadruple etc
+
+enum TPanicCodes
+    {
+    KPanicBadTotalQueueLength=1,    // once constructed, total queue length should be KNumRecorders
+    KPanicBadTotalQueueLength2,     // during construction or delation, total queue length should be <= KNumRecorders
+    KPanicBadBusyQueueLength,       // Busy queue should never exceed length of 1
+    EPanicBusyRecorderNotActive,    // If in the busy queue, should be active
+    EPanicNonBusyRecorderActive,    // opposite
+    };
+
+//Total Number of sample rates
+class CChannelAndSampleRateConverter;  // forward dec
+
+class TRecordSharedChunkBufConfig : public TSharedChunkBufConfigBase
+	{
+public:
+	TInt iBufferOffsetList[3];
+	};
+
+NONSHARABLE_CLASS(CAudioInput) : public CBase, 
+					public MAudioInput,
+					public MAIParamInterface
+	{
+	NONSHARABLE_CLASS( CRecorder ) : public CActive
+		{
+	public:
+		CRecorder(CAudioInput& aParent, TInt aIndex);
+		~CRecorder();
+		void Cancel();
+		
+		void RecordData();
+		TInt Index() const;
+		void ReleaseBuffer(TBool aDoAnyway=EFalse);
+		TBool IsBusy() const;
+		TBool BufferHeld() const;
+		TInt Length() const; 
+		TInt Offset() const;
+		TInt StatusOrOffset() const;
+		
+		TSglQueLink iLink; // used to form queues. Treat as private.
+		
+		// from CActive
+		void RunL();
+		void DoCancel(); 
+	private:
+		CAudioInput& iParent;
+		const TInt iIndex;
+		TInt iLength;
+		TBool iBufferHeld;
+		};
+
+private:
+	class TFormatData
+		{
+	public:
+		inline TFormatData():
+			iSampleRate(8000), iRequestedChannels(1) // default
+			{
+			}
+	public:
+		TInt iSampleRate;
+		TInt iActualRate;
+		TInt iRequestedChannels;
+		TInt iActualChannels;			
+		};
+	
+public:
+	static CAudioInput* NewL(MAudioInputObserver& aObserver);
+	~CAudioInput();
+	
+	// from MAudioInput
+	void Release();
+	TInt Initialize(const TAudioInputParams& aParams);
+	void Close();
+	TInt Start();
+	void BufferAck();
+	TInt Pause();
+	TInt Resume();
+	TInt Flush();
+	void Stop();
+	TAny* Interface(TUid aInterfaceUid);
+	
+	// from MAIParamInterface
+	TInt SetGain(TInt aGain);
+	TInt GetBufferSizes(TInt& aMinSize, TInt& aMaxSize);
+	TInt GetSupportedSampleRates(RArray<TInt>& aSupportedSampleRates);
+	
+	RSoundSc& RecordSoundDevice();
+	void BufferArrives(CRecorder* aRecorder);
+	void BufferError(CRecorder* aRecorder, TInt aError);
+	TInt SetFormat(const TAudioInputParams& aFormat);
+	TInt NegotiateFormat(const TAudioInputParams& aFormat, TFormatData &aFormatData);
+	TInt GetSupportedSampleRates(RArray<TInt>& aSupportedSampleRates, RSoundSc& aSoundDevice);
+
+private:
+	CAudioInput(MAudioInputObserver& aObserver);
+	void ConstructL();
+	void Cancel();
+
+	static TInt Callback(TAny* aPtr);
+	void AsyncCallbackL();
+    void RequestCallback();
+	
+	void CancelRecorders();
+    void CancelPendingRecorders();
+    void CancelBusyRecorder();
+	void InternalStop();
+	void InternalFlush();
+	void RecordAllIdle();
+	
+	void UseBuffer(CRecorder* aRecorder);
+	void HandleBufferAck();
+	
+	void CheckFullInvariant();
+	void CheckInvariant(TBool aKnownConstructed=ETrue);
+	
+#ifdef _DEBUG
+    void CheckActiveRecorders();
+    void CheckActiveRecorders(TSglQue<CRecorder>& aQueue, TBool aExpected, TInt aPanicCode);
+#endif
+
+	static TInt QLength(TSglQue<CRecorder>& aQueue);
+	CRecorder* QPop(TSglQue<CRecorder>& aQueue);
+	TBool QPop(CRecorder*& aRecorder, TSglQue<CRecorder>& aQueue);
+	
+	inline TInt BufferLength() const { return iBufferLength; } // TODO required?
+		
+private:
+	MAudioInputObserver& iObserver;
+	
+	enum TState
+		{
+		EStateCreated2,
+		EStateInitialized2,
+		EStateRecordWait2,
+		EStateRecordWaitAck2,
+		};
+	
+	enum TRunningState // when in RecordWait2 or RecordWaitAck2
+	    {
+	    ERStateRunning,        // recording
+	    ERStatePaused,         // paused state
+	    ERStateFinishing,      // look to do InputFinished() on next tick
+	    ERStateFinished,       // InputFinished() sent
+	    ERStateFailed,         // InputError() sent 
+	    };
+		
+	TState iState;
+	TRunningState iRState;
+	TRecordSharedChunkBufConfig iRecordBufferConfig;
+	RSoundSc iRecordSoundDevice;
+	RChunk iChunk;
+	CRecorder* iRecorders[KNumRecorders];
+	CAsyncCallBack* iAsyncCallBack;
+	TInt iBufferLength;	// this is the length of buffers we request
+    CChannelAndSampleRateConverter* iConverter;
+    TPtrC8 iBufPtr;     // this is usually the descriptor sent to the observer
+    RBuf8 iConvBuff;    // extra buffer from when we use a converter
+    
+    TSglQue<CRecorder> iIdleQueue;        // just sitting there
+    TSglQue<CRecorder> iRecordingQueue;   // record operation outstanding
+    TSglQue<CRecorder> iPendingQueue;     // buffer has been recorded, waiting to be processed
+    TSglQue<CRecorder> iBusyQueue;        // mid InputAvailable()/BufferAck() cycle. Length <= 1
+	};
+
+inline TBool CAudioInput::QPop(CRecorder*& aRecorder, TSglQue<CRecorder>& aQueue)
+// overload of QPop(), since "while (recorder = QPop(...))" etc gives warnings
+// This allows "while (QPop(recorder, ...))" instead
+	{
+	CRecorder* recorder = QPop(aQueue);
+	if (recorder)
+		{
+		aRecorder = recorder;
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+#endif // SWAUDIOINPUTPRIV_H
+