diff -r 4f62049db6ac -r 709f89d8c047 mmserv/radioutility/radioserver/Server/Src/RadioServer.cpp --- a/mmserv/radioutility/radioserver/Server/Src/RadioServer.cpp Fri Feb 19 23:19:48 2010 +0200 +++ b/mmserv/radioutility/radioserver/Server/Src/RadioServer.cpp Fri Mar 12 15:45:41 2010 +0200 @@ -70,7 +70,8 @@ iMaxSigStrength(0), iEnableTunerInOffline(EFalse), iSquelch(EFalse), - iPreEmpted(EFalse) + iPreEmpted(EFalse), + iSchedulerWait( NULL ) { } @@ -127,6 +128,8 @@ iMapper = CTspClientMapper::NewL(); iTspState = CTspClientMapper::ERegisteredClients; #endif // RD_TSP_CLIENT_MAPPER + + iSchedulerWait = new (ELeave) CActiveSchedulerWait; RADIO_RDEBUG(_L("[RADIO-SVR] ConstructL() - End")); } @@ -166,6 +169,7 @@ delete iTunerControl; delete iTunerControlObserver; delete iAsyncRequest; + delete iSchedulerWait; ClearQueue(); iRdsNotifyClientIdArray.Close(); @@ -619,6 +623,11 @@ } break; case EStateTunerOff: + if( iSchedulerWait->IsStarted() ) + { + // let the PlayError() continue after this callback + iSchedulerWait->AsyncStop(); + } if ( iAsyncRequest && iAsyncRequest->iType == ERadioServSetFrequencyRange ) { if ( aError == KErrNone ) @@ -639,6 +648,14 @@ CompleteAsyncRequest(aError); } } + else + { + if( aError == KRadioServErrDuplicateRequest ) + { + // tuner off and duplicate request going on, trace it out + RADIO_RDEBUG(_L("[RADIO-SVR] TunerOffComplete() - EStateTunerOff - KRadioServErrDuplicateRequest")); + } + } break; default: // should never happen @@ -1387,7 +1404,7 @@ iDevSound->SetVolume(iSettings->Volume()); iSquelch = EFalse; } - CompleteAsyncRequest(KRadioServErrTuning); + // do not yet complete async request with KRadioServErrTuning } // We are being pre-empted by another application with higher priority. @@ -1395,8 +1412,18 @@ iState = EStateTunerOff; iPreEmpted = ETrue; iSettings->SetRadioOff(aError); - iTunerControl->TunerOff(); + iTunerControl->TunerOff(); //The adaptation is expected to call TunerOffComplete() upon completion + // wait for TunerOffComplete callback + iSchedulerWait->Start(); SetTspTargetClient( ERsPlayerIdle ); + + if ( iAsyncRequest && ( (iAsyncRequest->iType == ERadioServStationSeek) || + (iAsyncRequest->iType == ERadioServStationSeekByPTY) || + (iAsyncRequest->iType == ERadioServStationSeekByTA) || + (iAsyncRequest->iType == ERadioServStationSeekByTP) ) ) + { + CompleteAsyncRequest(KRadioServErrTuning); + } } }