os/mm/devsound/devsoundrefplugin/src/platsec/SoundDevice/MmfDevSoundCallbackHandler.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200 (2014-06-10)
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include "SoundDeviceBody.h"
    17 #include "MmfDevSoundCallbackHandler.h"
    18 #include "MmfAudioClientServer.h"
    19 
    20 CMsgQueueHandler* CMsgQueueHandler::NewL(RMMFDevSoundProxy* aDevSoundProxy,
    21 										 MDevSoundObserver& aDevSoundObserver,
    22 										 RMsgQueue<TMMFDevSoundQueueItem>* aMsgQueue,
    23 										 MMMFDevSoundCustomInterfaceObserver& aDevSoundIntfcObserver)
    24 	{
    25 	CMsgQueueHandler* self = new(ELeave) CMsgQueueHandler(aDevSoundProxy, aDevSoundObserver, aMsgQueue, aDevSoundIntfcObserver);
    26 	CleanupStack::PushL(self);
    27 	self->ConstructL();
    28 	CleanupStack::Pop();
    29 	return self;
    30 	}
    31 
    32 void CMsgQueueHandler::SetObserver(MDevSoundObserver& aDevSoundObserver)
    33 	{
    34 	iDevSoundObserver = &aDevSoundObserver;
    35 	}
    36 
    37 CMsgQueueHandler::CMsgQueueHandler(RMMFDevSoundProxy* aDevSoundProxy,
    38 								   MDevSoundObserver& aDevSoundObserver,
    39 								   RMsgQueue<TMMFDevSoundQueueItem>* aMsgQueue,
    40 								   MMMFDevSoundCustomInterfaceObserver& aDevSoundIntfcObserver) :
    41 								   CActive(EPriorityStandard), iDevSoundProxy(aDevSoundProxy),
    42 								   iDevSoundObserver(&aDevSoundObserver), iMsgQueue(aMsgQueue), iDevSoundIntfcObserver(aDevSoundIntfcObserver)
    43 	{
    44 	CActiveScheduler::Add(this);
    45 	}
    46 
    47 void CMsgQueueHandler::ConstructL()
    48 	{
    49 	}
    50 
    51 CMsgQueueHandler::~CMsgQueueHandler()
    52 	{
    53 	delete iBuffer;
    54 	Cancel();
    55 	iMsgQueue->Close();
    56 	}
    57 
    58 void CMsgQueueHandler::ReceiveEvents()
    59 	{
    60 	iMsgQueue->NotifyDataAvailable(iStatus);
    61 	SetActive();
    62 	}
    63 
    64 void CMsgQueueHandler::RunL()
    65 	{
    66 	TInt queueErr = iMsgQueue->Receive(iCurrentItem);	
    67 	TInt err = KErrNone;
    68 
    69 	if (!queueErr || queueErr == KErrUnderflow)
    70 		{
    71 		// Signal that we're ready to process the next message
    72 		iMsgQueue->NotifyDataAvailable(iStatus);
    73 		SetActive();							
    74 		}
    75 
    76 	if (!queueErr)
    77 		{	
    78 		iCurrentRequest = iCurrentItem.iRequest;
    79 		switch (iCurrentRequest)
    80 			{
    81 			case EMMFDevSoundProxyICEvent:
    82 				DoInitComplete();
    83 				break;
    84 			case EMMFDevSoundProxyBTBFEvent:
    85 				{
    86 				TRAP(err, DoBTBFCompleteL());
    87 				if (err)
    88 					{
    89 					iDevSoundObserver->PlayError(err);
    90 					}
    91 				}
    92 				break;
    93 			case EMMFDevSoundProxyBTBEEvent:
    94 				{
    95 				TRAP(err, DoBTBECompleteL());
    96 				if (err)
    97 					{
    98 					iDevSoundObserver->RecordError(err);
    99 					}
   100 				}
   101 				break;					
   102 			case EMMFDevSoundProxyPEEvent:
   103 				DoPlayErrorComplete();
   104 				break;
   105 			case EMMFDevSoundProxyREEvent:
   106 				DoRecordErrorComplete();
   107 				break;
   108 			case EMMFDevSoundProxyTFEvent:
   109 				DoToneFinishedComplete();
   110 				break;
   111 			case EMMFDevSoundProxySETCEvent:
   112 				DoSendEventToClientComplete();
   113 				break;
   114 			case EMMFDevSoundCustomCommandCloseMuxDemuxPair:
   115 				{
   116 				TMMFEvent pckgevent = iCurrentItem.iEventPckg();
   117 				TInt handle = pckgevent.iEventType.iUid;
   118 				iDevSoundIntfcObserver.CloseCustomInterface(handle);
   119 				}
   120 				break;
   121 			default:
   122 				break;
   123 			}
   124 		
   125 		}
   126 	}
   127 
   128 TInt CMsgQueueHandler::RunError(TInt aError)
   129 	{
   130 	TMMFEvent event;
   131 	event.iErrorCode = aError;
   132 	iDevSoundObserver->SendEventToClient(event);
   133 	return KErrNone;
   134 	}
   135 	
   136 void CMsgQueueHandler::DoCancel()
   137 	{
   138 	iMsgQueue->CancelDataAvailable();
   139 	}
   140 
   141 void CMsgQueueHandler::DoInitComplete()
   142 	{
   143 	iDevSoundObserver->InitializeComplete(iCurrentItem.iErrorCode);
   144 	}
   145 
   146 void CMsgQueueHandler::DoPlayErrorComplete()
   147 	{
   148 	iDevSoundObserver->PlayError(iCurrentItem.iErrorCode);
   149 	}
   150 
   151 void CMsgQueueHandler::DoBTBFCompleteL()
   152 	{
   153 	// Wanted to push both the message request and the message's data
   154 	// through the queue in one go but the data is too large so try
   155 	// issuing a new request for the data before doing all this...
   156 	User::LeaveIfError(iDevSoundProxy->BufferToBeFilledData(iSetPckg));
   157 	
   158 	TMMFDevSoundProxyHwBuf set;
   159 	set.iBufferType = iSetPckg().iBufferType;
   160 	set.iRequestSize = iSetPckg().iRequestSize;
   161 	set.iBufferSize = iSetPckg().iBufferSize;
   162 	set.iLastBuffer = iSetPckg().iLastBuffer;
   163 
   164 	CMMFDataBuffer* buffer = CMMFDescriptorBuffer::NewL(set.iBufferSize);
   165 	CleanupStack::PushL(buffer);
   166 	buffer->SetRequestSizeL(set.iRequestSize);
   167 	CleanupStack::Pop(buffer);
   168 	buffer->SetLastBuffer(set.iLastBuffer);
   169 	iDevSoundProxy->SetBuffer(buffer);//DevSoundProxy takes the ownership of "buffer"
   170 
   171 	iDevSoundObserver->BufferToBeFilled(buffer);
   172 	}
   173 
   174 void CMsgQueueHandler::DoBTBECompleteL()
   175 	{
   176 	User::LeaveIfError(iDevSoundProxy->BufferToBeEmptiedData(iSetPckg));
   177 	
   178 	TMMFDevSoundProxyHwBuf aSet;
   179 	aSet.iBufferType = iSetPckg().iBufferType;
   180 	aSet.iRequestSize = iSetPckg().iRequestSize;
   181 	aSet.iBufferSize = iSetPckg().iBufferSize;
   182 	aSet.iLastBuffer = iSetPckg().iLastBuffer;
   183 
   184 	if(iBuffer)
   185 		{
   186 		delete iBuffer;
   187 		iBuffer = NULL;
   188 		}
   189 	iBuffer = CMMFDescriptorBuffer::NewL(aSet.iBufferSize);
   190 	iBuffer->SetRequestSizeL(aSet.iRequestSize);
   191 	iBuffer->SetLastBuffer(aSet.iLastBuffer);
   192 	
   193 	User::LeaveIfError(iDevSoundProxy->GetRecordedBufferL(*iBuffer));  
   194 
   195 	iDevSoundObserver->BufferToBeEmptied(iBuffer);
   196 	}
   197 
   198 void CMsgQueueHandler::DoRecordErrorComplete()
   199 	{
   200 	iDevSoundObserver->RecordError(iCurrentItem.iErrorCode);
   201 	}
   202 	
   203 void CMsgQueueHandler::DoToneFinishedComplete()
   204 	{
   205 	iDevSoundObserver->ToneFinished(iCurrentItem.iErrorCode);
   206 	}
   207 	
   208 void CMsgQueueHandler::DoSendEventToClientComplete()
   209 	{
   210 	iDevSoundObserver->SendEventToClient(iCurrentItem.iEventPckg());	
   211 	}