More simplifications.
[SDL.s60v3.git] / src / audio / symbian / streamplayer.cpp
blobf78bc83fb27966e6d35500dc65c38ab646280f3c
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 < 0 || aNew > KMaxVolume)
90 return;
92 iVolume = aNew;
93 iState |= EVolumeChange;
96 void CStreamPlayer::Open()
98 TMdaAudioDataSettings audioSettings;
99 audioSettings.Query();
100 audioSettings.iSampleRate = iRate;
101 audioSettings.iChannels = iChannels;
102 audioSettings.iVolume = 0;
104 iState &= ~EStopped;
105 iStream->Open(&audioSettings);
108 void CStreamPlayer::Stop()
110 if(iState & (EStarted | EInited))
112 Close();
113 iState |= EStopped;
117 void CStreamPlayer::Start()
119 iState |= EStarted;
120 if(iState & EInited)
122 Request();
124 else if(iState & EStopped)
126 Open();
130 void CStreamPlayer::Close()
132 iState &= ~EInited;
133 iStream->Stop();
134 iState &= ~EStarted;
137 void CStreamPlayer::Request()
139 if(iState & EVolumeChange)
141 const TReal newVol = iVolume;
142 const TReal newMax = KMaxVolume;
143 const int maxVol = iStream->MaxVolume();
144 const TReal max = static_cast<TReal>(maxVol);
145 const TReal newvolume = (newVol * max) / newMax;
146 const int vol = static_cast<TReal>(newvolume);
147 iStream->SetVolume(vol);
148 iState &= ~EVolumeChange;
151 if(iState & EStarted)
153 iPtr.Set(iProvider.Data());
155 if(iPtr.Length() == 0)
157 iPtr.Set(iSilence);
159 TRAPD(err, iStream->WriteL(iPtr));
160 if(err != KErrNone)
162 iObs.Complete(MStreamObs::EWrite, err);
166 void CStreamPlayer::MaoscOpenComplete(int aError)
168 if(aError == KErrNone)
170 iStream->SetDataTypeL(iType);
171 iStream->SetAudioPropertiesL(iRate, iChannels);
172 iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
174 iState |= EInited;
176 SetVolume(Volume());
178 if(iState & EStarted)
180 Request();
183 if(!(iState & EDied))
184 iObs.Complete(MStreamObs::EInit, aError);
187 void CStreamPlayer::MaoscBufferCopied(int aError, const TDesC8& /*aBuffer*/)
189 if(aError == KErrNone)
191 if(iState & EInited)
192 Request();
193 else
194 iStream->Stop();
196 else if(!(iState & EDied))
197 iObs.Complete(MStreamObs::EPlay, aError);
200 void CStreamPlayer::MaoscPlayComplete(int aError)
202 iState &= ~EStarted;
203 if(!(iState & EDied))
204 iObs.Complete(MStreamObs::EClose, aError);