|
1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // |
|
15 |
|
16 #ifndef __TESTUSEOLDCODECAUDIOCONTROLLER_H__ |
|
17 #define __TESTUSEOLDCODECAUDIOCONTROLLER_H__ |
|
18 |
|
19 // Standard EPOC32 includes required by this header file |
|
20 |
|
21 #include <e32base.h> |
|
22 #include <e32std.h> |
|
23 #include <ecom/implementationproxy.h> |
|
24 |
|
25 // Public Media Server includes |
|
26 #include <mmf/common/mmfcontroller.h> |
|
27 #include <mmf/server/mmfdatasink.h> |
|
28 #include <mmf/server/mmfdatasource.h> |
|
29 |
|
30 #include <mmf/server/mmfdatapathproxy.h> |
|
31 #include <mmf/common/mmfaudio.h> |
|
32 #include <mmf/server/mmfaudiooutput.h> |
|
33 #include <mmf/server/mmfaudioinput.h> |
|
34 #include <mmf/common/mmfstandardcustomcommands.h> |
|
35 |
|
36 |
|
37 const TInt KOneSecondInMicroSeconds(1000000); |
|
38 |
|
39 |
|
40 class CMMFMessageHolder : public CBase |
|
41 { |
|
42 public: |
|
43 static CMMFMessageHolder* NewL(TMMFMessage& aMessage) |
|
44 {return new(ELeave) CMMFMessageHolder(aMessage);} |
|
45 void Complete(TInt a) {iMessage.Complete(a);} |
|
46 private: |
|
47 CMMFMessageHolder(TMMFMessage& aMessage): CBase(), iMessage(aMessage) {} |
|
48 TMMFMessage iMessage; |
|
49 }; |
|
50 |
|
51 /** |
|
52 * |
|
53 * The public API for clients of the MMFAudioController |
|
54 * |
|
55 */ |
|
56 |
|
57 class CMMFTestUseOldCodecAudioController : public CMMFController, |
|
58 public MAsyncEventHandler, |
|
59 public MMMFAudioPlayDeviceCustomCommandImplementor, |
|
60 public MMMFAudioRecordDeviceCustomCommandImplementor, |
|
61 public MMMFAudioPlayControllerCustomCommandImplementor, |
|
62 public MMMFAudioRecordControllerCustomCommandImplementor, |
|
63 public MMMFAudioControllerCustomCommandImplementor |
|
64 { |
|
65 public: |
|
66 static CMMFController* NewL(); |
|
67 virtual ~CMMFTestUseOldCodecAudioController(); |
|
68 |
|
69 void DevSoundInitialised(TInt aError); |
|
70 |
|
71 //implement CMMFController ecom plugin interface |
|
72 virtual void AddDataSourceL(MDataSource& aDataSource); |
|
73 virtual void AddDataSinkL(MDataSink& aDataSink); |
|
74 virtual void RemoveDataSourceL(MDataSource& aDataSource); |
|
75 virtual void RemoveDataSinkL(MDataSink& aDataSink); |
|
76 |
|
77 virtual void ResetL(); |
|
78 virtual void PrimeL(); |
|
79 virtual void PlayL(); |
|
80 virtual void PauseL(); |
|
81 virtual void StopL() {} //not required |
|
82 virtual void StopL(TMMFMessage& aMessage); |
|
83 |
|
84 virtual TTimeIntervalMicroSeconds PositionL() const; |
|
85 virtual void SetPositionL(const TTimeIntervalMicroSeconds& aPosition); |
|
86 virtual TTimeIntervalMicroSeconds DurationL() const; |
|
87 virtual void CustomCommand(TMMFMessage& aMessage); |
|
88 virtual void SetPrioritySettings(const TMMFPrioritySettings& aPrioritySettings); |
|
89 virtual void GetNumberOfMetaDataEntriesL(TInt& aNumberOfEntries); |
|
90 virtual CMMFMetaDataEntry* GetMetaDataEntryL(TInt aIndex); |
|
91 |
|
92 //from MAsyncEventHandler |
|
93 virtual TInt SendEventToClient(const TMMFEvent& aEvent); |
|
94 |
|
95 //from MMMFAudioPlayDeviceCustomCommandImplementor |
|
96 virtual void MapdSetVolumeL(TInt aVolume); |
|
97 virtual void MapdGetMaxVolumeL(TInt& aMaxVolume); |
|
98 virtual void MapdGetVolumeL(TInt& aVolume); |
|
99 virtual void MapdSetVolumeRampL(const TTimeIntervalMicroSeconds& aRampDuration); |
|
100 virtual void MapdSetBalanceL(TInt aBalance); |
|
101 virtual void MapdGetBalanceL(TInt& aBalance); |
|
102 |
|
103 //from MMMFAudioRecordDeviceCustomCommandImplementor |
|
104 virtual void MardSetGainL(TInt aGain); |
|
105 virtual void MardGetMaxGainL(TInt& aMaxGain); |
|
106 virtual void MardGetGainL(TInt& aGain); |
|
107 virtual void MardSetBalanceL(TInt aBalance); |
|
108 virtual void MardGetBalanceL(TInt& aBalance); |
|
109 |
|
110 //from MMMFAudioPlayControllerCustomCommandImplementor |
|
111 virtual void MapcSetPlaybackWindowL(const TTimeIntervalMicroSeconds& aStart, const TTimeIntervalMicroSeconds& aEnd); |
|
112 virtual void MapcDeletePlaybackWindowL(); |
|
113 virtual void MapcGetLoadingProgressL(TInt& aPercentageComplete); |
|
114 |
|
115 //from MMMFAudioRecordControllerCustomCommandImplementor |
|
116 virtual void MarcGetRecordTimeAvailableL(TTimeIntervalMicroSeconds& aTime); |
|
117 virtual void MarcSetMaxDurationL(const TTimeIntervalMicroSeconds& aMaxDuration); |
|
118 virtual void MarcSetMaxFileSizeL(TInt aFileSize); |
|
119 virtual void MarcCropL(TBool aToEnd); |
|
120 virtual void MarcAddMetaDataEntryL(const CMMFMetaDataEntry& aNewEntry); |
|
121 virtual void MarcRemoveMetaDataEntryL(TInt aIndex); |
|
122 virtual void MarcReplaceMetaDataEntryL(TInt aIndex, const CMMFMetaDataEntry& aNewEntry); |
|
123 |
|
124 //from MMMFAudioControllerCustomCommandImplementor |
|
125 virtual void MacSetSourceSampleRateL(TUint aSampleRate); |
|
126 virtual void MacSetSourceNumChannelsL(TUint aNumChannels); |
|
127 virtual void MacSetSourceFormatL(TUid aFormatUid); |
|
128 virtual void MacSetSinkSampleRateL(TUint aSampleRate); |
|
129 virtual void MacSetSinkNumChannelsL(TUint aNumChannels); |
|
130 virtual void MacSetSinkFormatL(TUid aFormatUid); |
|
131 virtual void MacSetCodecL(TFourCC aSourceDataType, TFourCC aSinkDataType); |
|
132 virtual void MacSetSourceBitRateL(TUint aBitRate); |
|
133 virtual void MacSetSourceDataTypeL(TFourCC aDataType); |
|
134 virtual void MacSetSinkBitRateL(TUint aRate); |
|
135 virtual void MacSetSinkDataTypeL(TFourCC aDataType); |
|
136 virtual void MacGetSourceSampleRateL(TUint& aRate); |
|
137 virtual void MacGetSourceBitRateL(TUint& aRate); |
|
138 virtual void MacGetSourceNumChannelsL(TUint& aNumChannels); |
|
139 virtual void MacGetSourceFormatL(TUid& aFormat); |
|
140 virtual void MacGetSourceDataTypeL(TFourCC& aDataType); |
|
141 virtual void MacGetSinkSampleRateL(TUint& aRate); |
|
142 virtual void MacGetSinkBitRateL(TUint& aRate); |
|
143 virtual void MacGetSinkNumChannelsL(TUint& aNumChannels); |
|
144 virtual void MacGetSinkFormatL(TUid& aFormat); |
|
145 virtual void MacGetSinkDataTypeL(TFourCC& aDataType); |
|
146 virtual void MacGetSupportedSourceSampleRatesL(RArray<TUint>& aSupportedRates); |
|
147 virtual void MacGetSupportedSourceBitRatesL(RArray<TUint>& aSupportedRates); |
|
148 virtual void MacGetSupportedSourceNumChannelsL(RArray<TUint>& aSupportedChannels); |
|
149 virtual void MacGetSupportedSourceDataTypesL(RArray<TFourCC>& aSupportedDataTypes); |
|
150 virtual void MacGetSupportedSinkSampleRatesL(RArray<TUint>& aSupportedRates); |
|
151 virtual void MacGetSupportedSinkBitRatesL(RArray<TUint>& aSupportedRates); |
|
152 virtual void MacGetSupportedSinkNumChannelsL(RArray<TUint>& aSupportedChannels); |
|
153 virtual void MacGetSupportedSinkDataTypesL(RArray<TFourCC>& aSupportedDataTypes); |
|
154 |
|
155 public: |
|
156 |
|
157 /** |
|
158 TControllerState is an enumeration within the namespace CMMFAudioController |
|
159 The enumeration provides a set of control states: |
|
160 EStopped is the initial state the controller resides in after it has been loaded |
|
161 EPrimed is the state the controller is in when it has been associated with datapaths but is not streaming data |
|
162 EPlaying is the state the controller is in when it is streaming data |
|
163 */ |
|
164 enum TControllerState |
|
165 { |
|
166 EStopped, |
|
167 EPrimed, |
|
168 EPlaying |
|
169 }; |
|
170 |
|
171 protected: |
|
172 CMMFTestUseOldCodecAudioController(); |
|
173 protected: |
|
174 void ConstructL(); |
|
175 void NegotiateL(); |
|
176 |
|
177 void ConvertFromDevSoundCapsToSampleRatesL(const TMMFCapabilities& aDevSoundCaps, |
|
178 RArray<TUint>& aSampleRates); |
|
179 void ConvertFromDevSoundCapsToNumChannelsL(const TMMFCapabilities& aDevSoundCaps, |
|
180 RArray<TUint>& aNumChannels); |
|
181 void ConvertFromDevSoundCapsToDataTypesL(const TMMFCapabilities& aDevSoundCaps, |
|
182 RArray<TFourCC>& aDataTypes); |
|
183 void ConvertFromSampleRateToDevSoundCapsL(TUint aSampleRate, TMMFCapabilities& aDevSoundCaps); |
|
184 void ConvertFromNumChannelsToDevSoundCapsL(TUint aNumChannels, TMMFCapabilities& aDevSoundCaps); |
|
185 void ConvertFromDataTypeToDevSoundCapsL(TFourCC aDataType, TMMFCapabilities& aDevSoundCaps); |
|
186 |
|
187 // state accessor functions |
|
188 TBool SetState( TControllerState aState ); |
|
189 TControllerState State() const ; |
|
190 TBool IsValidStateTransition( TControllerState aState ) const; |
|
191 TBool Invariant() const; |
|
192 TBool IsValidState( TControllerState aState ) const ; |
|
193 TBool ResetPostCondition() const; |
|
194 TBool SinkFormatRequired( MDataSink& aDataSink) const; |
|
195 TBool SourceFormatRequired(MDataSource& aDataSource) const; |
|
196 void CalculateLeftRightBalance( TInt& aLeft, TInt& aRight, TInt aBalance ) const; |
|
197 void CalculateBalance( TInt& aBalance, TInt aLeft, TInt aRight ) const; |
|
198 |
|
199 |
|
200 //This method is used to assist testing of the audio controller |
|
201 virtual TBool IsUnderTest(){return EFalse;} |
|
202 |
|
203 private: |
|
204 /** |
|
205 * |
|
206 * This class is required to ensure that CMMFTestUseOldCodecAudioController::PrimeL() runs synchronously |
|
207 * as in some configurations it needs to wait on DevSound initialisation. This class sits between the |
|
208 * DevSound interface and the actual real DevSound client, propagating all the function calls to it. |
|
209 * The only additional functionality it performs is to inform the CMMFTestUseOldCodecAudioController object |
|
210 * when DevSound initialisation is complete. |
|
211 * |
|
212 */ |
|
213 class TDevSoundEventHandler : public MDevSoundObserver |
|
214 { |
|
215 public: |
|
216 TDevSoundEventHandler(); |
|
217 |
|
218 void SetInterceptedDevSoundObserver(MDevSoundObserver* aObserver); |
|
219 void SetEventObserver(CMMFTestUseOldCodecAudioController* aObserver); |
|
220 |
|
221 //from MDevSoundObserver |
|
222 virtual void InitializeComplete(TInt aError); |
|
223 virtual void ToneFinished(TInt aError); |
|
224 virtual void BufferToBeFilled(CMMFBuffer* aBuffer); |
|
225 virtual void PlayError(TInt aError); |
|
226 virtual void BufferToBeEmptied(CMMFBuffer* aBuffer); |
|
227 virtual void RecordError(TInt aError); |
|
228 virtual void ConvertError(TInt aError); |
|
229 virtual void DeviceMessage(TUid aMessageType, const TDesC8& aMsg); |
|
230 |
|
231 private: |
|
232 MDevSoundObserver* iInterceptedDevSoundObserver; //Not owned |
|
233 CMMFTestUseOldCodecAudioController* iEventObserver; //Not owned |
|
234 }; |
|
235 |
|
236 private: |
|
237 MDataSource* iDataSource; |
|
238 MDataSink* iDataSink; |
|
239 CMMFDataPath* iDataPath; |
|
240 CMMFFormatDecode* iSourceFormat; |
|
241 CMMFFormatEncode* iSinkFormat; |
|
242 TMediaId iMediaId; |
|
243 TControllerState iState; |
|
244 TMMFPrioritySettings iPrioritySettings; |
|
245 TBool iSourceAndSinkAdded; |
|
246 |
|
247 TBool iStoppingRecording; |
|
248 |
|
249 CMMFMessageHolder* iStoppingMessage; |
|
250 TDevSoundEventHandler iDevSoundEventHandler; |
|
251 CActiveSchedulerWait* iWaitForAsyncService; |
|
252 }; |
|
253 |
|
254 |
|
255 #endif |