sl@0: // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "SoundDeviceBody.h" sl@0: #include "MmfDevSoundCallbackHandler.h" sl@0: #include "MmfAudioClientServer.h" sl@0: sl@0: CMsgQueueHandler* CMsgQueueHandler::NewL(RMMFDevSoundProxy* aDevSoundProxy, sl@0: MDevSoundObserver& aDevSoundObserver, sl@0: RMsgQueue* aMsgQueue, sl@0: MMMFDevSoundCustomInterfaceObserver& aDevSoundIntfcObserver) sl@0: { sl@0: CMsgQueueHandler* self = new(ELeave) CMsgQueueHandler(aDevSoundProxy, aDevSoundObserver, aMsgQueue, aDevSoundIntfcObserver); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: void CMsgQueueHandler::SetObserver(MDevSoundObserver& aDevSoundObserver) sl@0: { sl@0: iDevSoundObserver = &aDevSoundObserver; sl@0: } sl@0: sl@0: CMsgQueueHandler::CMsgQueueHandler(RMMFDevSoundProxy* aDevSoundProxy, sl@0: MDevSoundObserver& aDevSoundObserver, sl@0: RMsgQueue* aMsgQueue, sl@0: MMMFDevSoundCustomInterfaceObserver& aDevSoundIntfcObserver) : sl@0: CActive(EPriorityStandard), iDevSoundProxy(aDevSoundProxy), sl@0: iDevSoundObserver(&aDevSoundObserver), iMsgQueue(aMsgQueue), iDevSoundIntfcObserver(aDevSoundIntfcObserver) sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: void CMsgQueueHandler::ConstructL() sl@0: { sl@0: } sl@0: sl@0: CMsgQueueHandler::~CMsgQueueHandler() sl@0: { sl@0: delete iBuffer; sl@0: Cancel(); sl@0: iMsgQueue->Close(); sl@0: } sl@0: sl@0: void CMsgQueueHandler::ReceiveEvents() sl@0: { sl@0: iMsgQueue->NotifyDataAvailable(iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: void CMsgQueueHandler::RunL() sl@0: { sl@0: TInt queueErr = iMsgQueue->Receive(iCurrentItem); sl@0: TInt err = KErrNone; sl@0: sl@0: if (!queueErr || queueErr == KErrUnderflow) sl@0: { sl@0: // Signal that we're ready to process the next message sl@0: iMsgQueue->NotifyDataAvailable(iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: if (!queueErr) sl@0: { sl@0: iCurrentRequest = iCurrentItem.iRequest; sl@0: switch (iCurrentRequest) sl@0: { sl@0: case EMMFDevSoundProxyICEvent: sl@0: DoInitComplete(); sl@0: break; sl@0: case EMMFDevSoundProxyBTBFEvent: sl@0: { sl@0: TRAP(err, DoBTBFCompleteL()); sl@0: if (err) sl@0: { sl@0: iDevSoundObserver->PlayError(err); sl@0: } sl@0: } sl@0: break; sl@0: case EMMFDevSoundProxyBTBEEvent: sl@0: { sl@0: TRAP(err, DoBTBECompleteL()); sl@0: if (err) sl@0: { sl@0: iDevSoundObserver->RecordError(err); sl@0: } sl@0: } sl@0: break; sl@0: case EMMFDevSoundProxyPEEvent: sl@0: DoPlayErrorComplete(); sl@0: break; sl@0: case EMMFDevSoundProxyREEvent: sl@0: DoRecordErrorComplete(); sl@0: break; sl@0: case EMMFDevSoundProxyTFEvent: sl@0: DoToneFinishedComplete(); sl@0: break; sl@0: case EMMFDevSoundProxySETCEvent: sl@0: DoSendEventToClientComplete(); sl@0: break; sl@0: case EMMFDevSoundCustomCommandCloseMuxDemuxPair: sl@0: { sl@0: TMMFEvent pckgevent = iCurrentItem.iEventPckg(); sl@0: TInt handle = pckgevent.iEventType.iUid; sl@0: iDevSoundIntfcObserver.CloseCustomInterface(handle); sl@0: } sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: sl@0: } sl@0: } sl@0: sl@0: TInt CMsgQueueHandler::RunError(TInt aError) sl@0: { sl@0: TMMFEvent event; sl@0: event.iErrorCode = aError; sl@0: iDevSoundObserver->SendEventToClient(event); sl@0: return KErrNone; sl@0: } sl@0: sl@0: void CMsgQueueHandler::DoCancel() sl@0: { sl@0: iMsgQueue->CancelDataAvailable(); sl@0: } sl@0: sl@0: void CMsgQueueHandler::DoInitComplete() sl@0: { sl@0: iDevSoundObserver->InitializeComplete(iCurrentItem.iErrorCode); sl@0: } sl@0: sl@0: void CMsgQueueHandler::DoPlayErrorComplete() sl@0: { sl@0: iDevSoundObserver->PlayError(iCurrentItem.iErrorCode); sl@0: } sl@0: sl@0: void CMsgQueueHandler::DoBTBFCompleteL() sl@0: { sl@0: // Wanted to push both the message request and the message's data sl@0: // through the queue in one go but the data is too large so try sl@0: // issuing a new request for the data before doing all this... sl@0: User::LeaveIfError(iDevSoundProxy->BufferToBeFilledData(iSetPckg)); sl@0: sl@0: TMMFDevSoundProxyHwBuf set; sl@0: set.iBufferType = iSetPckg().iBufferType; sl@0: set.iRequestSize = iSetPckg().iRequestSize; sl@0: set.iBufferSize = iSetPckg().iBufferSize; sl@0: set.iLastBuffer = iSetPckg().iLastBuffer; sl@0: sl@0: CMMFDataBuffer* buffer = CMMFDescriptorBuffer::NewL(set.iBufferSize); sl@0: CleanupStack::PushL(buffer); sl@0: buffer->SetRequestSizeL(set.iRequestSize); sl@0: CleanupStack::Pop(buffer); sl@0: buffer->SetLastBuffer(set.iLastBuffer); sl@0: iDevSoundProxy->SetBuffer(buffer);//DevSoundProxy takes the ownership of "buffer" sl@0: sl@0: iDevSoundObserver->BufferToBeFilled(buffer); sl@0: } sl@0: sl@0: void CMsgQueueHandler::DoBTBECompleteL() sl@0: { sl@0: User::LeaveIfError(iDevSoundProxy->BufferToBeEmptiedData(iSetPckg)); sl@0: sl@0: TMMFDevSoundProxyHwBuf aSet; sl@0: aSet.iBufferType = iSetPckg().iBufferType; sl@0: aSet.iRequestSize = iSetPckg().iRequestSize; sl@0: aSet.iBufferSize = iSetPckg().iBufferSize; sl@0: aSet.iLastBuffer = iSetPckg().iLastBuffer; sl@0: sl@0: if(iBuffer) sl@0: { sl@0: delete iBuffer; sl@0: iBuffer = NULL; sl@0: } sl@0: iBuffer = CMMFDescriptorBuffer::NewL(aSet.iBufferSize); sl@0: iBuffer->SetRequestSizeL(aSet.iRequestSize); sl@0: iBuffer->SetLastBuffer(aSet.iLastBuffer); sl@0: sl@0: User::LeaveIfError(iDevSoundProxy->GetRecordedBufferL(*iBuffer)); sl@0: sl@0: iDevSoundObserver->BufferToBeEmptied(iBuffer); sl@0: } sl@0: sl@0: void CMsgQueueHandler::DoRecordErrorComplete() sl@0: { sl@0: iDevSoundObserver->RecordError(iCurrentItem.iErrorCode); sl@0: } sl@0: sl@0: void CMsgQueueHandler::DoToneFinishedComplete() sl@0: { sl@0: iDevSoundObserver->ToneFinished(iCurrentItem.iErrorCode); sl@0: } sl@0: sl@0: void CMsgQueueHandler::DoSendEventToClientComplete() sl@0: { sl@0: iDevSoundObserver->SendEventToClient(iCurrentItem.iEventPckg()); sl@0: }