Allow conditional audio device disabling.
[SDL.s60v3.git] / src / audio / symbian / streamplayer.cpp
blobbe1a22f26e2da0ed9dae17a8b9dc57777ceb87b0
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);
57 CStreamPlayer::~CStreamPlayer()
59 iState |= EDied;
60 if(iState & EInited)
61 Close();
62 delete iStream;
65 int CStreamPlayer::OpenStream(int aRate, int aChannels, TUint32 aType)
67 Close();
69 iType = aType;
71 iRate = GetSampleRate(aRate);
72 if(iRate == KErrNotFound)
73 return KErrNotSupported;
75 iChannels = GetChannels(aChannels);
76 if(iChannels == KErrNotFound)
77 return KErrNotSupported;
79 Open();
81 return KErrNone;
84 void CStreamPlayer::SetVolume(int aNew)
86 if(aNew < 0 || aNew > KMaxVolume)
87 return;
89 iVolume = aNew;
90 iState |= EVolumeChange;
93 void CStreamPlayer::Open()
95 TMdaAudioDataSettings audioSettings;
96 audioSettings.Query();
97 audioSettings.iSampleRate = iRate;
98 audioSettings.iChannels = iChannels;
99 audioSettings.iVolume = 0;
101 iState &= ~EStopped;
102 iStream->Open(&audioSettings);
105 void CStreamPlayer::Stop()
107 if(iState & (EStarted | EInited))
109 Close();
110 iState |= EStopped;
114 void CStreamPlayer::Start()
116 iState |= EStarted;
117 if(iState & EInited)
119 Request();
121 else if(iState & EStopped)
123 Open();
127 void CStreamPlayer::Close()
129 iState &= ~EInited;
130 iStream->Stop();
131 iState &= ~EStarted;
134 void CStreamPlayer::Request()
136 if(iState & EVolumeChange)
138 iStream->SetVolume((iVolume * iStream->MaxVolume()) / KMaxVolume);
139 iState &= ~EVolumeChange;
142 if(iState & EStarted)
144 iPtr.Set(iProvider.Data());
146 if(iPtr.Length() != 0)
148 TRAPD(err, iStream->WriteL(iPtr));
149 if(err != KErrNone)
151 iObs.Complete(MStreamObs::EWrite, err);
156 void CStreamPlayer::MaoscOpenComplete(int aError)
158 if(aError == KErrNone)
160 iStream->SetDataTypeL(iType);
161 iStream->SetAudioPropertiesL(iRate, iChannels);
162 iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
164 iState |= EInited;
166 SetVolume(iVolume);
168 if(iState & EStarted)
170 Request();
173 if(!(iState & EDied))
174 iObs.Complete(MStreamObs::EInit, aError);
177 void CStreamPlayer::MaoscBufferCopied(int aError, const TDesC8& /*aBuffer*/)
179 if(aError == KErrNone)
181 if(iState & EInited)
182 Request();
183 else
184 iStream->Stop();
186 else if(!(iState & EDied))
187 iObs.Complete(MStreamObs::EPlay, aError);
190 void CStreamPlayer::MaoscPlayComplete(int aError)
192 iState &= ~EStarted;
193 if(!(iState & EDied))
194 iObs.Complete(MStreamObs::EClose, aError);