23 #include "tmscsdevsoundobserver.h" |
23 #include "tmscsdevsoundobserver.h" |
24 |
24 |
25 using namespace TMS; |
25 using namespace TMS; |
26 |
26 |
27 // CONSTANTS |
27 // CONSTANTS |
28 const gint KTimeoutInitial = 200000; // 200 ms initial timeout |
28 const gint KTimeoutInitial = 250000; // 250 ms initial timeout |
29 const gint KTimeoutMultiplier = 2; // Double the timeout for each retry |
29 const gint KTimeoutMultiplier = 2; // Double the timeout for each retry |
30 const gint KMicroSecMultiply = 1000000; //1 sec |
30 const gint KPeriodicTimeoutMax = 2000000; // 2 sec max periodic timeout |
|
31 const gint KMicroSecMultiply = 1000000; // 1 sec |
31 |
32 |
32 // ----------------------------------------------------------------------------- |
33 // ----------------------------------------------------------------------------- |
33 // TMSCSDevSound |
34 // TMSCSDevSound |
34 // ----------------------------------------------------------------------------- |
35 // ----------------------------------------------------------------------------- |
35 // |
36 // |
36 TMSCSDevSound::TMSCSDevSound(TMSCSDevSoundObserver& observer) : |
37 TMSCSDevSound::TMSCSDevSound(TMSCSDevSoundObserver& observer) : |
37 iObserver(observer) |
38 iObserver(observer) |
38 { |
39 { |
39 iTimer = NULL; |
40 iTimer = NULL; |
40 iTimeout = KTimeoutInitial; |
41 iPeriodic = KTimeoutInitial; |
|
42 iElapsedTime = 0; |
41 iInitRetryTime = 0; |
43 iInitRetryTime = 0; |
42 iStartRetryTime = 0; |
44 iStartRetryTime = 0; |
43 } |
45 } |
44 |
46 |
45 // ----------------------------------------------------------------------------- |
47 // ----------------------------------------------------------------------------- |
118 delete iDevSound; |
120 delete iDevSound; |
119 TRACE_PRN_FN_EXT; |
121 TRACE_PRN_FN_EXT; |
120 } |
122 } |
121 |
123 |
122 // ----------------------------------------------------------------------------- |
124 // ----------------------------------------------------------------------------- |
123 // Tries to activate the audio stream if not active or activating |
125 // Tries to activate the audio stream if not already active or activating |
124 // ----------------------------------------------------------------------------- |
126 // ----------------------------------------------------------------------------- |
125 // |
127 // |
126 void TMSCSDevSound::Activate(const gint retrytime) |
128 void TMSCSDevSound::Activate(const gint retrytime) |
127 { |
129 { |
128 iStartRetryTime = retrytime; |
130 iStartRetryTime = retrytime; |
175 { |
177 { |
176 StartTimer(); |
178 StartTimer(); |
177 } |
179 } |
178 else |
180 else |
179 { |
181 { |
180 iTimeout = KTimeoutInitial; |
182 iPeriodic = KTimeoutInitial; |
181 CancelTimer(); |
183 CancelTimer(); |
182 NotifyEvent(aError); |
184 NotifyEvent(aError); |
183 } |
185 } |
184 TRACE_PRN_FN_EXT; |
186 TRACE_PRN_FN_EXT; |
185 } |
187 } |
186 |
188 |
187 |
|
188 // ----------------------------------------------------------------------------- |
189 // ----------------------------------------------------------------------------- |
189 // TMSCSDevSound::NotifyEvent |
190 // TMSCSDevSound::NotifyEvent |
190 // ----------------------------------------------------------------------------- |
191 // ----------------------------------------------------------------------------- |
191 // |
192 // |
192 void TMSCSDevSound::NotifyEvent(gint error) |
193 void TMSCSDevSound::NotifyEvent(gint error) |
225 // |
229 // |
226 void TMSCSDevSound::StartTimer() |
230 void TMSCSDevSound::StartTimer() |
227 { |
231 { |
228 if (iTimer && (iInitRetryTime != 0 || iStartRetryTime != 0)) |
232 if (iTimer && (iInitRetryTime != 0 || iStartRetryTime != 0)) |
229 { |
233 { |
230 iTimer->NotifyAfter(iTimeout, *this); |
234 iTimer->NotifyAfter(iPeriodic, *this); |
231 } |
235 } |
232 } |
236 } |
233 |
237 |
234 // ----------------------------------------------------------------------------- |
238 // ----------------------------------------------------------------------------- |
235 // From TMSTimerObserver |
239 // From TMSTimerObserver |
236 // Notification upon TMSTimer timeout. |
240 // Notification upon TMSTimer timeout. |
237 // ----------------------------------------------------------------------------- |
241 // ----------------------------------------------------------------------------- |
238 // |
242 // |
239 void TMSCSDevSound::TimerEvent() |
243 void TMSCSDevSound::TimerEvent() |
240 { |
244 { |
241 iTimeout *= KTimeoutMultiplier; |
245 if (iPeriodic < KPeriodicTimeoutMax) |
|
246 { |
|
247 iPeriodic *= KTimeoutMultiplier; |
|
248 } |
|
249 iElapsedTime += iPeriodic; |
242 |
250 |
243 if (!iActivationOngoing) //Initializing |
251 if (!iActivationOngoing) //Initializing |
244 { |
252 { |
245 if (iTimeout > (iInitRetryTime * KMicroSecMultiply)) |
253 if (iElapsedTime >= (iInitRetryTime * KMicroSecMultiply)) |
246 { |
254 { |
247 iInitRetryTime = 0; |
255 iInitRetryTime = 0; //timer will not start again |
248 } |
256 } |
249 TRAPD(status, InitializeL()); |
257 TRAPD(status, InitializeL()); |
250 if (status != TMS_RESULT_SUCCESS) |
258 if (status != TMS_RESULT_SUCCESS) |
251 { |
259 { |
252 NotifyEvent(status); |
260 NotifyEvent(status); |
253 } |
261 } |
254 } |
262 } |
255 else //Activating |
263 else //Activating |
256 { |
264 { |
257 if (iTimeout > (iStartRetryTime * KMicroSecMultiply)) |
265 if (iElapsedTime >= (iStartRetryTime * KMicroSecMultiply)) |
258 { |
266 { |
259 iStartRetryTime = 0; |
267 iStartRetryTime = 0; //timer will not start again |
260 } |
268 } |
261 Deactivate(FALSE); |
269 Deactivate(FALSE); |
262 Activate(iStartRetryTime); |
270 Activate(iStartRetryTime); |
263 } |
271 } |
264 } |
272 } |