SDL-1.2.14
[sdl_omap.git] / src / audio / symbian / streamplayer.cpp
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