First public contribution.
1 // Copyright (c) 2002-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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #include "mmfclientaudiostreamutils.h"
17 #include <mmf/common/mmfstandardcustomcommands.h>
18 #include <mda/common/audio.h>
20 const TInt KSampleRate8000 = 8000;
21 const TInt KSampleRate11025 = 11025;
22 const TInt KSampleRate12000 = 12000;
23 const TInt KSampleRate16000 = 16000;
24 const TInt KSampleRate22050 = 22050;
25 const TInt KSampleRate24000 = 24000;
26 const TInt KSampleRate32000 = 32000;
27 const TInt KSampleRate44100 = 44100;
28 const TInt KSampleRate48000 = 48000;
29 const TInt KSampleRate64000 = 64000;
30 const TInt KSampleRate88200 = 88200;
31 const TInt KSampleRate96000 = 96000;
34 _LIT(KStreamUtilsPanicCategory, "MMFStreamUtils");
36 enum TStreamUtilsPanic
39 EPanicPostConditionViolation,
40 EPanicUnknownSampleRate,
41 EPanicUnknownChannelSetting,
45 LOCAL_C void Panic(const TStreamUtilsPanic aReason)
47 User::Panic(KStreamUtilsPanicCategory, aReason);
52 * Function to map the channels enum defined in Mda to the one
56 TUint StreamUtils::MapChannelsMdaToMMFL(TInt aMdaChannels)
58 if (aMdaChannels >= 0)
60 if (aMdaChannels & TMdaAudioDataSettings::EChannelsStereo)
64 else if ((aMdaChannels == 0) || // zeroed settings (it's valid.) return a default value
65 (aMdaChannels & TMdaAudioDataSettings::EChannelsMono))
71 User::Leave(KErrNotSupported);
77 * Function to map the sample rate enum defined in Mda to the one
81 TUint StreamUtils::MapSampleRateMdaToMMFL(TInt aMdaSampleRate)
83 switch (aMdaSampleRate)
85 case TMdaAudioDataSettings::ESampleRate8000Hz:
86 return EMMFSampleRate8000Hz;
87 case TMdaAudioDataSettings::ESampleRate11025Hz:
88 return EMMFSampleRate11025Hz;
89 case TMdaAudioDataSettings::ESampleRate12000Hz:
90 return EMMFSampleRate12000Hz;
91 case TMdaAudioDataSettings::ESampleRate16000Hz:
92 return EMMFSampleRate16000Hz;
93 case TMdaAudioDataSettings::ESampleRate22050Hz:
94 return EMMFSampleRate22050Hz;
95 case TMdaAudioDataSettings::ESampleRate24000Hz:
96 return EMMFSampleRate24000Hz;
97 case TMdaAudioDataSettings::ESampleRate32000Hz:
98 return EMMFSampleRate32000Hz;
99 case TMdaAudioDataSettings::ESampleRate44100Hz:
100 return EMMFSampleRate44100Hz;
101 case TMdaAudioDataSettings::ESampleRate48000Hz:
102 return EMMFSampleRate48000Hz;
103 case TMdaAudioDataSettings::ESampleRate64000Hz:
104 return EMMFSampleRate64000Hz;
105 case TMdaAudioDataSettings::ESampleRate96000Hz:
106 return EMMFSampleRate96000Hz;
107 case TMdaAudioDataSettings::ESampleRateFixed:
108 case TMdaAudioDataSettings::ESampleRateAnyInRange:
109 User::Leave(KErrNotSupported);
111 case 0: // zeroed settings (it's valid.) return a default value
112 return EMMFSampleRate8000Hz;
114 User::Leave(KErrNotSupported);
120 * Function to convert the mmf sample rate enum to an actual sample rate value
122 TInt StreamUtils::SampleRateAsValue(const TMMFCapabilities& aCaps)
126 case EMMFSampleRate8000Hz:
127 return KSampleRate8000;
128 case EMMFSampleRate11025Hz:
129 return KSampleRate11025;
130 case EMMFSampleRate12000Hz:
131 return KSampleRate12000;
132 case EMMFSampleRate16000Hz:
133 return KSampleRate16000;
134 case EMMFSampleRate22050Hz:
135 return KSampleRate22050;
136 case EMMFSampleRate24000Hz:
137 return KSampleRate24000;
138 case EMMFSampleRate32000Hz:
139 return KSampleRate32000;
140 case EMMFSampleRate44100Hz:
141 return KSampleRate44100;
142 case EMMFSampleRate48000Hz:
143 return KSampleRate48000;
144 case EMMFSampleRate64000Hz:
145 return KSampleRate64000;
146 case EMMFSampleRate88200Hz:
147 return KSampleRate88200;
148 case EMMFSampleRate96000Hz:
149 return KSampleRate96000;
151 Panic(EPanicUnknownSampleRate);
157 * Return the current number of bytes required to render each sample, based
158 * on the given capabilities. This depends on the current encoding and
159 * whether the sample is mono or stereo
161 TInt StreamUtils::BytesPerSample(const TMMFCapabilities& aCaps)
163 TInt noOfChannels = (aCaps.iChannels == EMMFStereo) ? 2 : 1;
164 switch (aCaps.iEncoding)
166 case EMMFSoundEncoding8BitPCM:
167 case EMMFSoundEncoding8BitALaw:
168 case EMMFSoundEncoding8BitMuLaw:
169 return (1 * noOfChannels);
170 case EMMFSoundEncoding16BitPCM:
171 return (2 * noOfChannels);
173 Panic(EPanicUnknownEncoding);
178 * CalculateLeftRightBalance
183 * !(aBalance < KMMFBalanceMaxLeft || aBalance > KMMFBalanceMaxRight)
185 * aLeft = m ( aBalance ) + c
186 * when aBalance = KMMFBalanceMaxLeft aLeft = 100
187 * when aBalance = KMMFBalanceMaxRight aLeft = 0
188 * 100 = m( KMMFBalanceMaxLeft ) + c
189 * 0 = m( KMMFBalanceMaxRight ) + c
190 * c = -(KMMFBalanceMaxRight) m
191 * 100 = m(KMMFBalanceMaxLeft ) - m(KMMFBalanceMaxRight)
192 * m = 100/(KMMFBalanceMaxLeft - KMMFBalanceMaxRight )
193 * c = -(KMMFBalanceMaxRight) * 100 /(KMMFBalanceMaxLeft - KMMFBalanceMaxRight )
194 * aLeft = ( aBalance - KMMFBalanceMaxRight ) * 100 /( KMMFBalanceMaxLeft - KMMFBalanceMaxRight )
196 void StreamUtils::CalculateLeftRightBalance( TInt& aLeft, TInt& aRight, TInt aBalance )
198 // [ assert precondition that aBalance is within limits ]
199 __ASSERT_DEBUG( !(aBalance < KMMFBalanceMaxLeft || aBalance > KMMFBalanceMaxRight), Panic(EPanicBadArgument));
201 //[ Now separate percentage balances out from aBalance ]
202 aLeft = (100 * (aBalance-KMMFBalanceMaxRight)) / (KMMFBalanceMaxLeft-KMMFBalanceMaxRight);
203 aRight = 100 - aLeft;
205 //[ assert post condition that left and right are within range ]
206 __ASSERT_DEBUG( ( (aLeft <= 100) && (aLeft >= 0) ), Panic(EPanicPostConditionViolation));
207 __ASSERT_DEBUG( ( (aRight <= 100) && (aRight >= 0) ), Panic(EPanicPostConditionViolation));
216 * follows a simple straight line transformation
218 * m = (KMMFBalanceMaxLeft-KMMFBalanceMaxRight)/ 100
219 * c = KMMFBalanceMaxRight
222 * KMMFBalanceMaxRight = m * 0 + c
223 * c = KMMFBalanceMaxRight
225 * KMMFBalanceMaxLeft = m * 100 + KMMFBalanceMaxRight
226 * m = ( KMMFBalanceMaxLeft - KMMFBalanceMaxRight ) /100
229 void StreamUtils::CalculateBalance( TInt& aBalance, TInt aLeft, TInt aRight )
231 void StreamUtils::CalculateBalance( TInt& aBalance, TInt aLeft, TInt /*aRight*/ )
234 //[ assert pre conditions ]
235 __ASSERT_DEBUG( (( aLeft + aRight ) == 100 ), Panic( EPanicBadArgument ));
236 __ASSERT_DEBUG( (( 0 <= aLeft) && ( 100 >= aLeft)), Panic( EPanicBadArgument) );
237 __ASSERT_DEBUG( (( 0 <= aRight) && ( 100 >= aRight)), Panic( EPanicBadArgument) );
239 aBalance = (aLeft * (KMMFBalanceMaxLeft-KMMFBalanceMaxRight))/100 + KMMFBalanceMaxRight;
241 //[ assert post condition that aBalance is within limits ]
242 __ASSERT_DEBUG( !(aBalance < KMMFBalanceMaxLeft || aBalance > KMMFBalanceMaxRight), Panic(EPanicPostConditionViolation));