diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/aknsoundplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/aknsoundplayer.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,477 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// AKNSOUNDPLAYER.CPP +// +// Copyright (c) 1997-2001 Symbian Ltd. All rights reserved. +// + +// Avkon KeySound Player + + +#include "aknsoundplayer.h" + +#include +#include +#include +#include +#include +#include +#include +#include "avkon.hrh" +#include + +const TInt KAknResourceBufferSize = 512; + + +// RAknSoundServerSession + +TInt RAknSoundServerSession::Connect() + { + iKeySoundServerExists = EFalse; + + // Create a session with zero message slots (since we have no asycronous calls) + TInt ret=CreateSession(__KEYSOUND_SERVER_NAME,TVersion(KKeySoundServMajorVN,KKeySoundServMinorVN,KKeySoundServBuildVN),0); + if ( ret == KErrNone ) + { + iKeySoundServerExists = ETrue; + } + return KErrNone; + } + +TInt RAknSoundServerSession::ServerRequest(TInt aFunction,const TIpcArgs& aArgs) + { + TInt err = KErrServerTerminated; + if (Handle()) + { + err = SendReceive(aFunction, aArgs); + } + + if (err == KErrServerTerminated) + { + // Try to reconnect, if the keysound server has been shutdown + Connect(); + if ( iKeySoundServerExists ) + { + err = SendReceive(aFunction, aArgs); + } + else + { + return KErrNone; // We couldn't start KeySoundServer, just omit the error.. + } + } + return err; + } + +TBool RAknSoundServerSession::Init(TInt aUid) + { + // Initialise returnCode to ETrue because ServerRequest may fail to set it if sound + // server is broken, and in that case we do not want to attempt to load sounds from + // resource, which may happen if the uninitialised value == EFalse. + TPckgBuf returnCode(ETrue); + + TIpcArgs args ( &returnCode, aUid ); + ServerRequest(EKeySoundServerInit,args); + return returnCode(); + } + +#pragma warning( disable : 4244 ) +//\S60\AVKON\SRC\Aknsoundplayer.cpp(404) : warning C4244: '=' : conversion from 'int' to 'short', possible loss of data + +void RAknSoundServerSession::AddSoundInfoResourceL(TInt aUid, TResourceReader aReader) + { + // Read information from resource read, and package up as a buffer + CBufFlat* buffer = CBufFlat::NewL(KAknResourceBufferSize); + CleanupStack::PushL(buffer); + + RBufWriteStream bufStream; + bufStream.Open(*buffer); + + CleanupClosePushL(bufStream); + + TInt count = aReader.ReadInt16(); + + bufStream.WriteUint16L(count); + + for (TInt ii=0; iiPtr(0); + TIpcArgs args (aUid, bufPtr.Length(), &bufPtr); + User::LeaveIfError( ServerRequest(EKeySoundServerAddSIDS,args) ); + + CleanupStack::PopAndDestroy(); // buffer + } + + +void RAknSoundServerSession::PushContextL(TInt aUid, TResourceReader& aReader, TInt aResourceId) + { + + TInt items = aReader.ReadInt16(); + TInt resSize = (items * 5); + + CBufFlat* buffer = CBufFlat::NewL(resSize); + CleanupStack::PushL(buffer); + + RBufWriteStream bufStream; + bufStream.Open(*buffer); + + CleanupClosePushL(bufStream); + + for (TInt ii=0; iiPtr(0); + TIpcArgs args (items, &bufPtr, aUid, aResourceId); + User::LeaveIfError(ServerRequest(EKeySoundServerPushContext,args)); + CleanupStack::PopAndDestroy(); // buffer + } + +void RAknSoundServerSession::PopContext() + { + ServerRequest(EKeySoundServerPopContext,TIpcArgs()); + } + +void RAknSoundServerSession::PlaySound(TInt aSid) + { + ServerRequest(EKeySoundServerPlaySID,TIpcArgs(aSid)); + } + +void RAknSoundServerSession::StopSound(TInt aSid) + { + ServerRequest(EKeySoundServerStopCurrentTone,TIpcArgs(aSid)); + } + +void RAknSoundServerSession::KeyPressed(TInt aKey, TBool aRepeat) + { + TIpcArgs args (aKey,aRepeat); + ServerRequest(EKeySoundServerPlayKey,args); + } + + +void RAknSoundServerSession::BringToForeground() + { + ServerRequest(EKeySoundServerBringToForeground,TIpcArgs()); + } + +void RAknSoundServerSession::LockContext() + { + ServerRequest(EKeySoundServerLockContext,TIpcArgs()); + } + +void RAknSoundServerSession::ReleaseContext() + { + ServerRequest(EKeySoundServerReleaseContext,TIpcArgs()); + } + +TInt RAknSoundServerSession::TopContext() + { + TInt aContextResourceId = 0; + TPckg pckg(aContextResourceId); + ServerRequest(EKeySoundServerTopContext,TIpcArgs(&pckg)); + return aContextResourceId; + } + + +void RAknSoundServerSession::DisableNextKeySound( TInt aScanCode ) + { + ServerRequest( EKeySoundServerDisableNextKeySound, TIpcArgs( aScanCode ) ); + } + + + +// CAknSoundPlayer + +CAknSoundPlayer* CAknSoundPlayer::NewL(TInt aUid) + { + CAknSoundPlayer* self = new(ELeave)CAknSoundPlayer(aUid); + return self; + } + +CAknSoundPlayer::CAknSoundPlayer(TInt aUid) +:iAppUid(aUid) + { + } + + +CAknSoundPlayer::~CAknSoundPlayer() + { + iSession.Close(); + } + + + +void CAknSoundPlayer::ConstructL() + { + User::LeaveIfError(iSession.Connect()); + TInt init = iSession.Init(iAppUid); + if (init == EFalse) + { + // Add the default system sounds if the system has not yet been initialized + DoAddSoundInfoResourceL(0, R_AVKON_DEFAULT_SOUND_LIST); + // Push default skey context + DoPushContextL(0, R_AVKON_DEFAULT_SKEY_LIST); + } + } + + +void CAknSoundPlayer::DoAddSoundInfoResourceL(TInt aUid, TInt aResourceId) + { + TResourceReader reader; + CEikonEnv* eikonEnv = CEikonEnv::Static(); + eikonEnv->CreateResourceReaderLC(reader, aResourceId); + iSession.AddSoundInfoResourceL(aUid, reader); + CleanupStack::PopAndDestroy(); // reader + } + + +void CAknSoundPlayer::Play(TInt aSid) + { + // If sId is less than EAvkonSIDNoSound, than this is a app-specific + // sound, so add the app Uid to the value so that the server can distinguish + TInt soundId = aSid; + if (soundId < EAvkonSIDNoSound) + { + soundId = (iAppUid << 16) + aSid; + }; + iSession.PlaySound(soundId); + } + +void CAknSoundPlayer::Stop(TInt aSid) + { + // If sId is less than EAvkonSIDNoSound, than this is a app-specific + // sound, so add the app Uid to the value so that the server can distinguish + TInt soundId = aSid; + if (soundId < EAvkonSIDNoSound) + { + soundId = (iAppUid << 16) + aSid; + }; + iSession.StopSound(soundId); + } + +void CAknSoundPlayer::PlaySound(TInt aScanCode, TInt aRepeat) + { + iSession.KeyPressed(aScanCode, aRepeat); + } + + + +void CAknSoundPlayer::AddAppSoundInfoListL(TInt aResourceId) + { + TResourceReader reader; + CEikonEnv* eikonEnv = CEikonEnv::Static(); + eikonEnv->CreateResourceReaderLC(reader, aResourceId); + iSession.AddSoundInfoResourceL(iAppUid, reader); + CleanupStack::PopAndDestroy(); // reader + } + + +void CAknSoundPlayer::PushContextL(TInt aResource) + { + DoPushContextL(iAppUid, aResource); + } + +void CAknSoundPlayer::DoPushContextL(TInt aUid, TInt aResource) + { + TResourceReader reader; + CEikonEnv* eikonEnv = CEikonEnv::Static(); + eikonEnv->CreateResourceReaderLC(reader, aResource); + iSession.PushContextL(aUid, reader, aResource); + CleanupStack::PopAndDestroy(); // reader + } + +void CAknSoundPlayer::PopContext() + { + iSession.PopContext(); + } + +void CAknSoundPlayer::BringToForeground() + { + iSession.BringToForeground(); + } + +void CAknSoundPlayer::LockContext() + { + iSession.LockContext(); + } + +void CAknSoundPlayer::ReleaseContext() + { + iSession.ReleaseContext(); + } + +TInt CAknSoundPlayer::TopContext() + { + return iSession.TopContext(); + } + +void CAknSoundPlayer::DisableNextKeySound( TInt aScanCode ) + { + return iSession.DisableNextKeySound( aScanCode ); + } + + +TInt CAknSoundPlayer::RequestSoundInfoL(TInt aAvkonSid, CAknSoundInfo& aInfo) + { + TInt ret = KErrNotFound; + TResourceReader reader; + CEikonEnv::Static()->CreateResourceReaderLC(reader, R_AVKON_DEFAULT_SOUND_LIST); + TInt count = reader.ReadInt16(); + + for (TInt i = 0; i < count; i++) + { + TInt sid; + TInt struct_id1 = reader.ReadInt16(); + TInt struct_id2 = reader.ReadInt16(); + TBool isAverell1Structure = ETrue; + if (struct_id1 == 0x1234 && struct_id2 == 0x5678) + { + isAverell1Structure = EFalse; + sid = reader.ReadInt16(); + aInfo.iPriority = (TInt16)reader.ReadInt16(); + } + else + { + sid = struct_id1; + aInfo.iPriority = struct_id2; + } + + aInfo.iPreference = reader.ReadInt32(); + TPtrC file = reader.ReadTPtrC(); + aInfo.iFrequency = (TInt16)reader.ReadInt16(); + aInfo.iDuration = reader.ReadInt32(); + + TInt seqLength = reader.ReadInt16(); + + if (file.Length() != 0) + { + aInfo.iType = ESoundFile; + delete aInfo.iFile; + aInfo.iFile = 0; + aInfo.iFile = file.AllocL(); + } + else if (seqLength == 0) + { + aInfo.iType = ESoundTone; + } + else + { + // type 2, sequence + aInfo.iType = ESoundSequence; + delete aInfo.iSequence; + aInfo.iSequence = 0; + TInt length = reader.ReadInt16(); + aInfo.iSequence = HBufC8::NewMaxL(length); + TPtr8 ptr = aInfo.iSequence->Des(); + for (TInt ii = 0; ii < length; ii++) + { + ptr[ii] = reader.ReadUint8(); + } + } + + if ( !seqLength && !isAverell1Structure ) + { + reader.ReadInt16(); + } + + aInfo.iVolume = (TUint8)reader.ReadUint8(); + + if ( sid == aAvkonSid ) + { + ret = KErrNone; + break; + } + } + + CleanupStack::PopAndDestroy(); // reader + return ret; + } + +#pragma warning( default : 4244 ) + + +// End of File