Remove two-stage construction.
[SDL.s60v3.git] / src / audio / symbian / streamplayer.cpp
blob1c0c431146daa2d861b24a5eef929287b3cf1327
1 #include "streamplayer.h"
2 #include <mda/common/audio.h>
3 #include <unistd.h>
5 static int GetSampleRate(int aRate)
7 switch(aRate)
9 case 8000: return TMdaAudioDataSettings::ESampleRate8000Hz;
10 case 11025: return TMdaAudioDataSettings::ESampleRate11025Hz;
11 case 12000: return TMdaAudioDataSettings::ESampleRate12000Hz;
12 case 16000: return TMdaAudioDataSettings::ESampleRate16000Hz;
13 case 22050: return TMdaAudioDataSettings::ESampleRate22050Hz;
14 case 24000: return TMdaAudioDataSettings::ESampleRate24000Hz;
15 case 32000: return TMdaAudioDataSettings::ESampleRate32000Hz;
16 case 44100: return TMdaAudioDataSettings::ESampleRate44100Hz;
17 case 48000: return TMdaAudioDataSettings::ESampleRate48000Hz;
18 case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz;
19 case 96000: return TMdaAudioDataSettings::ESampleRate96000Hz;
20 default: break;
22 return KErrNotFound;
25 static int GetChannels(int aChannels)
27 switch(aChannels)
29 case 1: return TMdaAudioDataSettings::EChannelsMono;
30 case 2: return TMdaAudioDataSettings::EChannelsStereo;
31 default: break;
33 return KErrNotFound;
36 int CStreamPlayer::ClosestSupportedRate(int aRate)
38 if(aRate > 96000)
39 return 96000;
41 int rate = aRate;
42 while(GetSampleRate(rate) == KErrNotFound)
44 ++rate;
46 return rate;
49 CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs)
50 : iProvider(aProvider)
51 , iObs(aObs)
52 , iVolume(KMaxVolume)
54 iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax);
56 iSilence.SetMax();
57 iSilence.FillZ();
60 CStreamPlayer::~CStreamPlayer()
62 iState |= EDied;
63 if(iState & EInited)
64 Close();
65 delete iStream;
68 int CStreamPlayer::OpenStream(int aRate, int aChannels, TUint32 aType)
70 Close();
72 iType = aType;
74 iRate = GetSampleRate(aRate);
75 if(iRate == KErrNotFound)
76 return KErrNotSupported;
78 iChannels = GetChannels(aChannels);
79 if(iChannels == KErrNotFound)
80 return KErrNotSupported;
82 Open();
84 return KErrNone;
87 void CStreamPlayer::SetVolume(int aNew)
89 if(aNew > MaxVolume())
90 return;
91 if(aNew < 0)
92 return;
94 iVolume = aNew;
96 iState |= EVolumeChange;
99 void CStreamPlayer::Open()
101 TMdaAudioDataSettings audioSettings;
102 audioSettings.Query();
103 audioSettings.iSampleRate = iRate;
104 audioSettings.iChannels = iChannels;
105 audioSettings.iVolume = 0;
107 iState &= ~EStopped;
108 iStream->Open(&audioSettings);
111 void CStreamPlayer::Stop()
113 if(iState & (EStarted | EInited))
115 Close();
116 iState |= EStopped;
120 void CStreamPlayer::Start()
122 iState |= EStarted;
123 if(iState & EInited)
125 Request();
127 else if(iState & EStopped)
129 Open();
133 void CStreamPlayer::Close()
135 iState &= ~EInited;
136 iStream->Stop();
137 iState &= ~EStarted;
140 void CStreamPlayer::Request()
142 if(iState & EVolumeChange)
144 const TReal newVol = iVolume;
145 const TReal newMax = MaxVolume();
146 const int maxVol = iStream->MaxVolume();
147 const TReal max = static_cast<TReal>(maxVol);
148 const TReal newvolume = (newVol * max) / newMax;
149 const int vol = static_cast<TReal>(newvolume);
150 iStream->SetVolume(vol);
151 iState &= ~EVolumeChange;
154 if(iState & EStarted)
156 iPtr.Set(iProvider.Data());
158 if(iPtr.Length() == 0)
160 iPtr.Set(iSilence);
162 TRAPD(err, iStream->WriteL(iPtr));
163 if(err != KErrNone)
165 iObs.Complete(MStreamObs::EWrite, err);
169 void CStreamPlayer::SetCapsL()
171 iStream->SetDataTypeL(iType);
172 iStream->SetAudioPropertiesL(iRate, iChannels);
175 void CStreamPlayer::MaoscOpenComplete(int aError)
177 if(aError == KErrNone)
179 TRAPD(err, SetCapsL());
180 if(err == KErrNone)
182 iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
183 iState |= EInited;
185 SetVolume(Volume());
187 if(iState & EStarted)
189 Request();
192 aError = err;
194 if(!(iState & EDied))
195 iObs.Complete(MStreamObs::EInit, aError);
198 void CStreamPlayer::MaoscBufferCopied(int aError, const TDesC8& /*aBuffer*/)
200 if(aError == KErrNone)
202 if(iState & EInited)
203 Request();
204 else
205 iStream->Stop();
207 else if(!(iState & EDied))
208 iObs.Complete(MStreamObs::EPlay, aError);
211 void CStreamPlayer::MaoscPlayComplete(int aError)
213 iState &= ~EStarted;
214 if(!(iState & EDied))
215 iObs.Complete(MStreamObs::EClose, aError);