diff -r 1cbb0d5bf7f2 -r b6dbf97aba93 mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.cpp --- a/mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.cpp Thu Sep 16 18:39:58 2010 +0100 +++ b/mmlibs/mmfw/src/Client/Audio/mmfclienttoneplayer.cpp Thu Sep 16 18:57:38 2010 +0100 @@ -1037,7 +1037,10 @@ } else { - iAsyncCallback->MatoPlayStarted(KErrNone); + if(iPlayStartObserver) + { + iAsyncCallback->MatoPlayStarted(KErrNone); + } } } @@ -1129,32 +1132,57 @@ void CMMFMdaAudioToneObserverCallback::MatoPrepareComplete(TInt aError) { - iAction = EPrepareComplete; - iErrorCode = aError; - - TRequestStatus* s = &iStatus; - SetActive(); - User::RequestComplete(s, KErrNone); + if(!IsActive()) + { + iAction = EPrepareComplete; + iErrorCode = aError; + + TRequestStatus* s = &iStatus; + SetActive(); + User::RequestComplete(s, KErrNone); + } + else + { + // Since the default granularity is 8, failing of Append() is unusual, hence ignoring the return err. + iCallBackQueue.Append(EPrepareComplete); + iCallBackQueueError.Append(aError); + } } void CMMFMdaAudioToneObserverCallback::MatoPlayComplete(TInt aError) { - iAction = EPlayComplete; - iErrorCode = aError; - - TRequestStatus* s = &iStatus; - SetActive(); - User::RequestComplete(s, KErrNone); + if(!IsActive()) + { + iAction = EPlayComplete; + iErrorCode = aError; + + TRequestStatus* s = &iStatus; + SetActive(); + User::RequestComplete(s, KErrNone); + } + else + { + iCallBackQueue.Append(EPlayComplete); + iCallBackQueueError.Append(aError); + } } void CMMFMdaAudioToneObserverCallback::MatoPlayStarted(TInt aError) { - iAction = EPlayStarted; - iErrorCode = aError; - - TRequestStatus* s = &iStatus; - SetActive(); - User::RequestComplete(s, KErrNone); + if(!IsActive()) + { + iAction = EPlayStarted; + iErrorCode = aError; + + TRequestStatus* s = &iStatus; + SetActive(); + User::RequestComplete(s, KErrNone); + } + else + { + iCallBackQueue.Append(EPlayStarted); + iCallBackQueueError.Append(aError); + } } void CMMFMdaAudioToneObserverCallback::RunL() @@ -1175,6 +1203,17 @@ iPlayStartCallback.MatoPlayStarted(iErrorCode); break; } + if(iCallBackQueue.Count() > 0 & !IsActive() ) + { + iAction = TMMFAudioToneObserverCallbackAction(iCallBackQueue[0]); + iCallBackQueue.Remove(0); + iErrorCode = iCallBackQueueError[0]; + iCallBackQueueError.Remove(0); + + TRequestStatus* s = &iStatus; + User::RequestComplete(s, KErrNone); + SetActive(); + } } void CMMFMdaAudioToneObserverCallback::DoCancel()