|
1 #include "streamplayer.h" |
|
2 #include<mda/common/audio.h> |
|
3 |
|
4 |
|
5 |
|
6 const TInt KMaxVolume(256); |
|
7 |
|
8 LOCAL_C TInt GetSampleRate(TInt aRate) |
|
9 { |
|
10 switch(aRate) |
|
11 { |
|
12 case 8000: return TMdaAudioDataSettings::ESampleRate8000Hz; |
|
13 case 11025: return TMdaAudioDataSettings::ESampleRate11025Hz; |
|
14 case 12000: return TMdaAudioDataSettings::ESampleRate12000Hz; |
|
15 case 16000: return TMdaAudioDataSettings::ESampleRate16000Hz; |
|
16 case 22050: return TMdaAudioDataSettings::ESampleRate22050Hz; |
|
17 case 24000: return TMdaAudioDataSettings::ESampleRate24000Hz; |
|
18 case 32000: return TMdaAudioDataSettings::ESampleRate32000Hz; |
|
19 case 44100: return TMdaAudioDataSettings::ESampleRate44100Hz; |
|
20 case 48000: return TMdaAudioDataSettings::ESampleRate48000Hz; |
|
21 case 96000: return TMdaAudioDataSettings::ESampleRate96000Hz; |
|
22 case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz; |
|
23 } |
|
24 return KErrNotFound; |
|
25 } |
|
26 |
|
27 LOCAL_C TInt GetChannels(TInt aChannels) |
|
28 { |
|
29 switch(aChannels) |
|
30 { |
|
31 case 1: return TMdaAudioDataSettings::EChannelsMono; |
|
32 case 2: return TMdaAudioDataSettings::EChannelsStereo; |
|
33 } |
|
34 return KErrNotFound; |
|
35 } |
|
36 |
|
37 TInt CStreamPlayer::ClosestSupportedRate(TInt aRate) |
|
38 { |
|
39 if(aRate > 96000) |
|
40 return 96000; |
|
41 TInt rate = aRate; |
|
42 while(GetSampleRate(rate) == KErrNotFound) |
|
43 { |
|
44 ++rate; |
|
45 } |
|
46 return rate; |
|
47 } |
|
48 |
|
49 CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs) : |
|
50 iProvider(aProvider), iObs(aObs), iVolume(KMaxVolume) |
|
51 { |
|
52 } |
|
53 |
|
54 CStreamPlayer::~CStreamPlayer() |
|
55 { |
|
56 iState |= EDied; |
|
57 if(iState & EInited) |
|
58 Close(); |
|
59 User::After(100000); //wait buffer to be flushed |
|
60 ASSERT(iPtr.Length() == 0); |
|
61 delete iStream; |
|
62 } |
|
63 |
|
64 |
|
65 void CStreamPlayer::ConstructL() |
|
66 { |
|
67 iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax); |
|
68 iSilence.SetMax(); |
|
69 iSilence.FillZ(); |
|
70 } |
|
71 |
|
72 |
|
73 TInt CStreamPlayer::OpenStream(TInt aRate, TInt aChannels, TUint32 aType) |
|
74 { |
|
75 Close(); |
|
76 |
|
77 iType = aType; |
|
78 |
|
79 iRate = GetSampleRate(aRate); |
|
80 if(iRate == KErrNotFound) |
|
81 return KErrNotSupported; |
|
82 |
|
83 iChannels = GetChannels(aChannels); |
|
84 if(iChannels == KErrNotFound) |
|
85 return KErrNotSupported; |
|
86 |
|
87 Open(); |
|
88 |
|
89 return KErrNone; |
|
90 } |
|
91 |
|
92 |
|
93 TInt CStreamPlayer::MaxVolume() const |
|
94 { |
|
95 return KMaxVolume; |
|
96 } |
|
97 |
|
98 void CStreamPlayer::SetVolume(TInt aNew) |
|
99 { |
|
100 |
|
101 const TInt maxi = MaxVolume(); |
|
102 if(aNew > maxi) |
|
103 return; |
|
104 if(aNew < 0) |
|
105 return; |
|
106 |
|
107 iVolume = aNew; |
|
108 |
|
109 iState |= EVolumeChange; |
|
110 } |
|
111 |
|
112 TInt CStreamPlayer::Volume() const |
|
113 { |
|
114 return iVolume; |
|
115 } |
|
116 |
|
117 void CStreamPlayer::Open() |
|
118 { |
|
119 TMdaAudioDataSettings audioSettings; |
|
120 audioSettings.Query(); |
|
121 audioSettings.iCaps = TMdaAudioDataSettings::ERealTime | |
|
122 TMdaAudioDataSettings::ESampleRateFixed; |
|
123 audioSettings.iSampleRate = iRate; |
|
124 audioSettings.iChannels = iChannels; |
|
125 audioSettings.iFlags = TMdaAudioDataSettings::ENoNetworkRouting; |
|
126 audioSettings.iVolume = 0; |
|
127 |
|
128 iState &= ~EStopped; |
|
129 iStream->Open(&audioSettings); |
|
130 } |
|
131 |
|
132 void CStreamPlayer::Stop() |
|
133 { |
|
134 if(iState & (EStarted | EInited)) |
|
135 { |
|
136 Close(); |
|
137 iState |= EStopped; |
|
138 } |
|
139 } |
|
140 |
|
141 void CStreamPlayer::Start() |
|
142 { |
|
143 if(iPtr.Length() == 0) |
|
144 { |
|
145 iState |= EStarted; |
|
146 if(iState & EInited) |
|
147 { |
|
148 Request(); |
|
149 } |
|
150 else if(iState & EStopped) |
|
151 { |
|
152 Open(); |
|
153 } |
|
154 } |
|
155 } |
|
156 |
|
157 void CStreamPlayer::Close() |
|
158 { |
|
159 iState &= ~EInited; |
|
160 iStream->Stop(); |
|
161 iState &= ~EStarted; |
|
162 } |
|
163 |
|
164 void CStreamPlayer::Request() |
|
165 { |
|
166 if(iState & EInited) |
|
167 { |
|
168 iPtr.Set(KNullDesC8); |
|
169 |
|
170 if(iState & EVolumeChange) |
|
171 { |
|
172 const TReal newVol = iVolume; |
|
173 const TReal newMax = MaxVolume(); |
|
174 const TInt maxVol = iStream->MaxVolume(); |
|
175 const TReal max = static_cast<TReal>(maxVol); |
|
176 const TReal newvolume = (newVol * max) / newMax; |
|
177 const TInt vol = static_cast<TReal>(newvolume); |
|
178 iStream->SetVolume(vol); |
|
179 iState &= ~EVolumeChange; |
|
180 } |
|
181 |
|
182 if(iState & EStarted) |
|
183 { |
|
184 iPtr.Set(iProvider.Data()); |
|
185 } |
|
186 if(iPtr.Length() == 0) |
|
187 { |
|
188 iPtr.Set(iSilence); |
|
189 } |
|
190 TRAPD(err, iStream->WriteL(iPtr)); |
|
191 if(err != KErrNone) |
|
192 { |
|
193 iObs.Complete(MStreamObs::EWrite, err); |
|
194 } |
|
195 /* else |
|
196 { |
|
197 iProvider.Written(iPtr.Length()); |
|
198 }*/ |
|
199 } |
|
200 } |
|
201 |
|
202 |
|
203 void CStreamPlayer::SetCapsL() |
|
204 { |
|
205 iStream->SetDataTypeL(iType); |
|
206 iStream->SetAudioPropertiesL(iRate, iChannels); |
|
207 } |
|
208 |
|
209 void CStreamPlayer::MaoscOpenComplete(TInt aError) |
|
210 { |
|
211 if(aError == KErrNone) |
|
212 { |
|
213 TRAPD(err, SetCapsL()); |
|
214 if(err == KErrNone) |
|
215 { |
|
216 iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime); |
|
217 iState |= EInited; |
|
218 |
|
219 |
|
220 SetVolume(Volume()); |
|
221 |
|
222 if(iState & EStarted) |
|
223 { |
|
224 Request(); |
|
225 } |
|
226 |
|
227 } |
|
228 aError = err; |
|
229 } |
|
230 if(!(iState & EDied)) |
|
231 iObs.Complete(MStreamObs::EInit, aError); |
|
232 } |
|
233 |
|
234 void CStreamPlayer::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/) |
|
235 { |
|
236 iPtr.Set(KNullDesC8); |
|
237 if(aError == KErrNone) |
|
238 { |
|
239 if(iState & EInited) |
|
240 Request(); |
|
241 else |
|
242 iStream->Stop(); |
|
243 } |
|
244 else if(!(iState & EDied)) |
|
245 iObs.Complete(MStreamObs::EPlay, aError); |
|
246 } |
|
247 |
|
248 void CStreamPlayer::MaoscPlayComplete(TInt aError) |
|
249 { |
|
250 iPtr.Set(KNullDesC8); |
|
251 iState &= ~EStarted; |
|
252 if(!(iState & EDied)) |
|
253 iObs.Complete(MStreamObs::EClose, aError); |
|
254 } |
|
255 |
|
256 TBool CStreamPlayer::Playing() const |
|
257 { |
|
258 return (iState & EInited) && (iState & EStarted); |
|
259 } |
|
260 |
|
261 TBool CStreamPlayer::Closed() const |
|
262 { |
|
263 return !(iState & EInited) && !(iState & EDied); |
|
264 } |
|
265 |
|
266 /* |
|
267 void CStreamPlayer::Request() |
|
268 { |
|
269 SetActive(); |
|
270 TRequestStatus* s = &iStatus; |
|
271 User::RequestComplete(s, KErrNone); |
|
272 } |
|
273 // iTimer.After(0); |
|
274 */ |
|
275 |
|
276 |
|
277 |
|
278 |
|
279 |