devsound/devsoundrefplugin/src/swcodecwrapper/mmfswaudioinputpriv.h
author hgs
Wed, 13 Oct 2010 12:08:48 +0100
changeset 3 28bdc4aca325
parent 0 79dd3e2336a0
permissions -rw-r--r--
2010wk42_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     2
// All rights reserved.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     7
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    10
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    11
// Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    12
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    13
// Description:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    14
// mmfswaudioinputpriv.h
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    15
// 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    16
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    17
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    18
#ifndef SWAUDIOINPUTPRIV_H
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    19
#define SWAUDIOINPUTPRIV_H
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    20
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    21
#include <e32def.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    22
#include "mmfswaudioinput.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    23
#include <d32soundsc.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    24
#include <e32base.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    25
#include <e32std.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    26
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    27
#define KNumRecorders (2) // 2 for double buffering, 4 quadruple etc
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    28
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    29
enum TPanicCodes
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    30
    {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    31
    KPanicBadTotalQueueLength=1,    // once constructed, total queue length should be KNumRecorders
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    32
    KPanicBadTotalQueueLength2,     // during construction or delation, total queue length should be <= KNumRecorders
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    33
    KPanicBadBusyQueueLength,       // Busy queue should never exceed length of 1
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    34
    EPanicBusyRecorderNotActive,    // If in the busy queue, should be active
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    35
    EPanicNonBusyRecorderActive,    // opposite
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    36
    };
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    37
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    38
//Total Number of sample rates
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    39
class CChannelAndSampleRateConverter;  // forward dec
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    40
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    41
class TRecordSharedChunkBufConfig : public TSharedChunkBufConfigBase
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    42
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    43
public:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    44
	TInt iBufferOffsetList[3];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    45
	};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    46
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    47
NONSHARABLE_CLASS(CAudioInput) : public CBase, 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    48
					public MAudioInput,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    49
					public MAIParamInterface
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    50
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    51
	NONSHARABLE_CLASS( CRecorder ) : public CActive
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    52
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    53
	public:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    54
		CRecorder(CAudioInput& aParent, TInt aIndex);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    55
		~CRecorder();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    56
		void Cancel();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    57
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    58
		void RecordData();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    59
		TInt Index() const;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    60
		void ReleaseBuffer(TBool aDoAnyway=EFalse);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    61
		TBool IsBusy() const;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    62
		TBool BufferHeld() const;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    63
		TInt Length() const; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    64
		TInt Offset() const;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    65
		TInt StatusOrOffset() const;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    66
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    67
		TSglQueLink iLink; // used to form queues. Treat as private.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    68
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    69
		// from CActive
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    70
		void RunL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    71
		void DoCancel(); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    72
	private:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    73
		CAudioInput& iParent;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    74
		const TInt iIndex;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    75
		TInt iLength;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    76
		TBool iBufferHeld;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    77
		};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    78
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    79
private:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    80
	class TFormatData
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    81
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    82
	public:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    83
		inline TFormatData():
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    84
			iSampleRate(8000), iRequestedChannels(1) // default
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    85
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    86
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    87
	public:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    88
		TInt iSampleRate;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    89
		TInt iActualRate;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    90
		TInt iRequestedChannels;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    91
		TInt iActualChannels;			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    92
		};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    93
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    94
public:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    95
	static CAudioInput* NewL(MAudioInputObserver& aObserver);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    96
	~CAudioInput();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    97
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    98
	// from MAudioInput
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    99
	void Release();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   100
	TInt Initialize(const TAudioInputParams& aParams);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   101
	void Close();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   102
	TInt Start();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   103
	void BufferAck();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   104
	TInt Pause();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   105
	TInt Resume();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   106
	TInt Flush();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   107
	void Stop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   108
	TAny* Interface(TUid aInterfaceUid);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   109
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   110
	// from MAIParamInterface
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   111
	TInt SetGain(TInt aGain);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   112
	TInt GetBufferSizes(TInt& aMinSize, TInt& aMaxSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   113
	TInt GetSupportedSampleRates(RArray<TInt>& aSupportedSampleRates);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   114
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   115
	RSoundSc& RecordSoundDevice();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   116
	void BufferArrives(CRecorder* aRecorder);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   117
	void BufferError(CRecorder* aRecorder, TInt aError);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   118
	TInt SetFormat(const TAudioInputParams& aFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   119
	TInt NegotiateFormat(const TAudioInputParams& aFormat, TFormatData &aFormatData);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   120
	TInt GetSupportedSampleRates(RArray<TInt>& aSupportedSampleRates, RSoundSc& aSoundDevice);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   121
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   122
private:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   123
	CAudioInput(MAudioInputObserver& aObserver);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   124
	void ConstructL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   125
	void Cancel();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   126
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   127
	static TInt Callback(TAny* aPtr);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   128
	void AsyncCallbackL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   129
    void RequestCallback();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   130
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   131
	void CancelRecorders();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   132
    void CancelPendingRecorders();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   133
    void CancelBusyRecorder();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   134
	void InternalStop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   135
	void InternalFlush();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   136
	void RecordAllIdle();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   137
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   138
	void UseBuffer(CRecorder* aRecorder);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   139
	void HandleBufferAck();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   140
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   141
	void CheckFullInvariant();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   142
	void CheckInvariant(TBool aKnownConstructed=ETrue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   143
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   144
#ifdef _DEBUG
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   145
    void CheckActiveRecorders();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   146
    void CheckActiveRecorders(TSglQue<CRecorder>& aQueue, TBool aExpected, TInt aPanicCode);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   147
#endif
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   148
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   149
	static TInt QLength(TSglQue<CRecorder>& aQueue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   150
	CRecorder* QPop(TSglQue<CRecorder>& aQueue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   151
	TBool QPop(CRecorder*& aRecorder, TSglQue<CRecorder>& aQueue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   152
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   153
	inline TInt BufferLength() const { return iBufferLength; } // TODO required?
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   154
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   155
private:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   156
	MAudioInputObserver& iObserver;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   157
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   158
	enum TState
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   159
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   160
		EStateCreated2,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   161
		EStateInitialized2,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   162
		EStateRecordWait2,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   163
		EStateRecordWaitAck2,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   164
		};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   165
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   166
	enum TRunningState // when in RecordWait2 or RecordWaitAck2
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   167
	    {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   168
	    ERStateRunning,        // recording
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   169
	    ERStatePaused,         // paused state
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   170
	    ERStateFinishing,      // look to do InputFinished() on next tick
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   171
	    ERStateFinished,       // InputFinished() sent
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   172
	    ERStateFailed,         // InputError() sent 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   173
	    };
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   174
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   175
	TState iState;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   176
	TRunningState iRState;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   177
	TRecordSharedChunkBufConfig iRecordBufferConfig;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   178
	RSoundSc iRecordSoundDevice;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   179
	RChunk iChunk;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   180
	CRecorder* iRecorders[KNumRecorders];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   181
	CAsyncCallBack* iAsyncCallBack;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   182
	TInt iBufferLength;	// this is the length of buffers we request
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   183
    CChannelAndSampleRateConverter* iConverter;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   184
    TPtrC8 iBufPtr;     // this is usually the descriptor sent to the observer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   185
    RBuf8 iConvBuff;    // extra buffer from when we use a converter
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   186
    
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   187
    TSglQue<CRecorder> iIdleQueue;        // just sitting there
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   188
    TSglQue<CRecorder> iRecordingQueue;   // record operation outstanding
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   189
    TSglQue<CRecorder> iPendingQueue;     // buffer has been recorded, waiting to be processed
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   190
    TSglQue<CRecorder> iBusyQueue;        // mid InputAvailable()/BufferAck() cycle. Length <= 1
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   191
	};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   192
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   193
inline TBool CAudioInput::QPop(CRecorder*& aRecorder, TSglQue<CRecorder>& aQueue)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   194
// overload of QPop(), since "while (recorder = QPop(...))" etc gives warnings
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   195
// This allows "while (QPop(recorder, ...))" instead
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   196
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   197
	CRecorder* recorder = QPop(aQueue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   198
	if (recorder)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   199
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   200
		aRecorder = recorder;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   201
		return ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   202
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   203
	return EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   204
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   205
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   206
#endif // SWAUDIOINPUTPRIV_H
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   207